例如,在以下代码中:
class Animal
class Dog extends Animal
trait Base {
def a: Animal = new Dog
}
trait Deri extends Base {
override val a: Dog
}
给出以下错误:
错误:覆盖类型为Dog的Trait Deri中的值a;方法a 特征类型基数=>动物需要是一个稳定的,不可改变的价值; (注意,类型Dog的Trait Deri中的值a是抽象的,并且是 因此被具体方法a覆盖了特征基数类型=> 动物)
我想知道,因为我已使用a
明确修改了Deri
中的override
,而Scala则选择反过来(覆盖a
{ {1}}中的Deri
中的错误消息,如错误信息中所示)?
答案 0 :(得分:2)
根据Scala Spec,具体定义总是覆盖抽象定义。
这个定义也决定了最重要的关系 匹配C类及其父母的成员。 首先,具体 定义始终覆盖抽象定义。其次,for 定义M和M'都是具体的或两者都是抽象的,M 如果M出现在前面的类中(在...中),则覆盖M' 线性化C)定义M'的类。
因此,要使其编译,您必须确保抽象方法可以被具体的方法覆盖。改变Deri:
trait Deri extends Base { override def a:Animal }
或更改Base
trait Base { val a: Dog = new Dog }