有Scala的路径依赖类型的首要成员。 说明中需要的Scala语言规范方面(Overriding

2019-10-21 13:49发布

考虑下面这个简单的斯卡拉实验:

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.cO2.C根据SLS?

更新

什么是值的类型O1.c和抽象值构件的Ac根据SLS?

Answer 1:

的类型的AcA#CO1.c (更新:类型O1.C ,其每SLS是O1.type#C确实符合A#c

问题1:内部O1 ,类型CO1.Cnew Cnew O1.C (见类型代号规则3.2.3)。 O1.C符合O1.C因为它是相等(因为等价是同余)。

问题2:它遵循,因为O1不符合O2 ,因为没有在3.5.1或3.5.2规则应该O1符合O2 。 因此,在3.5.2类型预测的规则并不适用。

构造函数调用返回该类型的值,每5.1.1。

(我真的不认为规范是学习这些东西的最佳方式;更好地得到的实际意义的东西首先是如何工作的)。



文章来源: Overriding members having Path Dependent types in Scala. Explanation is needed in terms of Scala Language Specification