多重覆盖类型成员

时间:2017-04-21 07:40:23

标签: scala types

让我们有这个简化的代码:

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

如何实现所需的行为以及为什么它会在第二个类型成员覆盖时崩溃?

2 个答案:

答案 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
}

但类型AB并不等同,这就是为什么您无法覆盖类型为A的{​​{1}}类型的原因。