考虑下面这个简单的斯卡拉实验:
scala> trait A {class C;val c:C}
defined trait A
scala> object O1 extends A {val c=new C}
defined object O1
scala> object O2 extends A {val c=O1.c}
<console>:9: error: overriding value c in trait A of type O2.C;
value c has incompatible type
object O2 extends A {val c=O1.c}
根据Scala的语言规范(SLS 5.1.4):
该类型的值的O1.c
应符合的类型Ac
因为前者替代后者。
问题1:
凡在SLS它被指定从中得出的类型的规则O1.c
确实不符合的类型Ac
?
那么,为什么应该object O1 extends A {val c=new C}
编译根据SLS?
问题2:
凡在SLS它被指定从中得出的值的类型规则O1.c
不符合值的类型O2.c
?
换句话说, 从该SLS排除它遵循 object O2 extends A {val c=O1.c}
不应编译?
相关阅读:为什么要的值的类型O2.c
是O2.C
根据SLS?
更新 :
什么是值的类型O1.c
和抽象值构件的Ac
根据SLS?