给出以下代码:
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
我的理解错了吗?
答案 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)
。如果e
为val e = new F
,该怎么办?