Would there be any way in scala, to define a trait's self type to be a case class, as in "any case class"? I would like a self type to be able to use the .copy
method of a case class, enforcing that its self type is some case class not a regular class. Structural types, I think, won't help, as they require a signature comprising specific arguments (I can probably not structural-type generically for any case class).
Please forgo the "if you need that you must be doing something wrong", as I've already moved on but my api design - will have been slicker if the above were possible. I am also curious for next times around.
This would only work using (as you suggest) structural types, and also only for a fixed known sequence of case class argument types (you need the exact signature of copy
). For example:
trait InCase[Repr] {
self: { def copy(foo: Int): Repr } =>
def test(foo: Int): Repr = copy(foo)
}
case class Fail(foo: Int, bar: String) extends InCase[Fail] //illegal inheritance
case class Succeed(foo: Int) extends InCase[Succeed]
Succeed(123).test(456)
来源:https://stackoverflow.com/questions/33674602/can-a-scala-self-type-enforce-a-case-class-type