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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With