2015-11-12 52 views
3

在scala中是否有任何方法来将特征的自我类型定义为个案类,如同“任何情况下的类”一样?我想要一个自我类型能够使用案例类的.copy方法,强制其自我类型是某些案例类不是常规类。我认为,结构类型将无济于事,因为它们需要包含特定参数的签名(对于任何案例类别,我都可能不是结构类型)。可以通过一个scala自我类型强制实例类类型

请放弃“如果你需要你必须做错事”,因为我已经开始了,但我的api设计 - 如果上述可能会变得更加轻松。我对下一次也很好奇。

回答

3

这只会使用(如您所建议的)结构类型,也只适用于固定的已知序列的案例类参数类型(您需要确切的签名copy)。例如:

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) 
+0

是啊,这就是为什么我认为结构类型将无法正常工作... – matanster

+0

好知道我很接近,虽然;) – matanster

相关问题