can a scala self type enforce a case class type

2019-01-20 01:02发布

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.

1条回答
虎瘦雄心在
2楼-- · 2019-01-20 01:25

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)
查看更多
登录 后发表回答