给出以下代码:
sealed abstract class Foobar[+Parent <: Foobar[Parent]](parent: Option[Parent])
trait Foo[+Parent <: Foobar[Parent]] extends Foobar[Foo[Parent]]
trait Bar[+Parent <: Foobar[Parent]] extends Foobar[Bar[Parent]]
class Raboof[+Parent <: Foobar[Parent]](val parent: Foo[Parent]) extends Foobar(Some(parent)) with Foo[Parent] with Bar[Parent]
如何在Scala的类型系统中解决这个继承问题?
动机:假设特征Foo
和Bar
将实现由几个类提供的方法,例如混合在这些特征中的类Raboof
。
Scala-SDK版本3.0.2-vfinal-20131028-1923-Typesafe的Scala工作表抱怨以下内容:
illegal inheritance; class Raboof inherits different type instances of class Foobar: scrap.Foobar[scrap.Bar[Parent]] and scrap.Foobar[scrap.Foo[Parent]]
不同类型的实例scrap.Foobar[scrap.Bar[Parent]]
和scrap.Foobar[scrap.Foo[Parent]]
应该溶解为单一类型。我对scrap.Foobar[scrap.Raboof[Parent]]
的理解是因为课程Raboof
混合了Foo
和Bar
两个特征。
答案 0 :(得分:0)
这个定义有效:
class Raboof[+Parent <: Foobar[Parent]](val parent: Raboof[Parent]) extends
Foobar[Raboof[Parent]](Some(parent)) with Foo[Parent] with Bar[Parent]
您的原始定义:
不会告诉Scala如何合并Foobar[Foo[Parent]]
和Foobar[Bar[Parent]]
。由于Foobar[Raboof[Parent]]
是两者的子类型,因此可以使用。
val parent
的类型错误,因为Foobar[Bar[Parent]]
需要parent: Bar[Parent]]
。