为什么覆盖已经实现的抽象类型是不可能的?

时间:2012-01-07 16:38:54

标签: scala override abstract-type

给出以下代码:

class A {

  class B

  type C <: B

  trait D

}

class E extends A {

  type C = B

}

class F extends E {

  override type C = B with D

}

为什么Eclipse Indigo IDE中的Scala IDE演示编译器会在E类中错误消息覆盖类型C,这等于F.this.B;类型C具有不兼容的类型

在所有类“B”仅用特征“D”“修改”之后,因此两个类型定义具有相同的基本类型,即“B”。因此兼容的类型定义。

下面的代码。我认为类型赋值的规则与变量赋值类似,例如:

class Foo

trait Bar

val a: Foo =  new Foo

val fooWithBar: Foo = new Foo with Bar

我的理解错了吗?

1 个答案:

答案 0 :(得分:13)

它们不兼容,C型可能用于逆变位置

class E extends A {
  type C = B
  def f(c: C)
}


class F extends E {
  override type C = B with D 
  def f(c: ???)
}

<强>补 给定e: E,您可以拨打e.f(new B)。如果eval e = new F,该怎么办?