【发布时间】:2010-07-04 10:23:15
【问题描述】:
我有一个来自 Java 库的基类,我无法修改其代码。这个类 (A) 有一个空方法 (b),它应该被声明为抽象:
class A {
def b { }
}
我在 Scala 中扩展了这个类并重写了方法以使其抽象:
abstract class AA extends A {
override def b
}
现在我在一个 trait 中实现这个方法:
trait B {
def b { println("B") }
}
如果我用特征 B 扩展 AA,我会得到一个错误:覆盖类型 A 中的方法 b => Unit; 类型 B 中的方法 b => 单元需要 `override' 修饰符:
class C extends AA with B {}
相反,如果代码是这样的,一切都编译没有错误,这对我来说似乎有点矛盾:
abstract class AA {
def b
}
trait B {
def b { println("B") }
}
class C extends AA with B {}
我正在运行 Scala 2.8.0RC3,并且对这种语言完全陌生(3 天)。另一个奇怪且相关的行为是在使 b 抽象时不需要覆盖标签:
abstract class AA extends A {
def b
}
【问题讨论】:
-
这是否与您想通过混合您自己在 trait 中定义的
def toString():String实现来替换 Java 类的 Java toString 实现一样的问题? -
不,情况不同。在这种情况下,编译器的行为完全有意义,因为应该使用哪个定义是模棱两可的:Java toString 或 mixin 之一。不过,就我而言,只有一个可用。