让我们有这个简化的代码:
class Base {
self =>
type Actual <: Base {type Actual = self.Actual}
def me: Actual = this.asInstanceOf[Actual]
}
class A extends Base {
override type Actual = A
}
class B extends A {
override type Actual = B
}
println((new B).me)
我希望me
始终具有正确的返回类型(对于流畅的界面)。不幸的是,这段代码崩溃了:
test.scala:13: error: overriding type Actual in class A, which equals this.A;
type Actual has incompatible type
override type Actual = B
^
one error found
如何实现所需的行为以及为什么它会在第二个类型成员覆盖时崩溃?
答案 0 :(得分:1)
这通常通过有限多态来实现。
class Base[Actual <: Base[Actual]] {
def me: Actual
}
class A extends Base[A]
class B extends Base[A]
如果您希望B
延长A
,则需要A
再次传递类型参数:
class A[Actual <: Base[Actual]] extends Base[Actual]
答案 1 :(得分:1)
@ flavian的答案是对的。由于这种多重覆盖不起作用的原因,请查看此讨论https://groups.google.com/forum/#!topic/scala-user/si51jb9RS68
特别是,这一点:
要覆盖类成员,覆盖的类型必须为 &#34;归入&#34;被覆盖成员的类型。 (规范第5.1.4节)
对于类型别名,&#34;包含&#34;意味着他们必须是等同的。 (规格 第3.5.2节,到最后。)
所以,你可以写这个,因为类型A
显然等同于A
:
class B extends A {
override type Actual = A
}
但类型A
和B
并不等同,这就是为什么您无法覆盖类型为A
的{{1}}类型的原因。