【发布时间】:2012-01-08 02:11:07
【问题描述】:
给定以下代码:
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 演示编译器会报错并显示错误消息 overriding type C in class E, which equals F.this.B; C 型有不兼容的类型?
毕竟类“B”只是“修改”了特征“D”,因此两个类型定义具有相同的基本类型,即“B”。因此兼容的类型定义。
下面的代码有效。我认为类型赋值的规则类似于变量赋值,例如:
class Foo
trait Bar
val a: Foo = new Foo
val fooWithBar: Foo = new Foo with Bar
我的理解有错吗?
【问题讨论】:
-
Foo with Bar 是 Foo 的子类型。这不是问题所在。固定类型成员时,您不能重新定义它,即使是子类型也是如此。如果你有类 Bar 扩展 Foo,你也不能将类型成员从 Foo 重新定义为 Bar。
标签: scala overriding abstract-type