Рассмотрим следующий простой эксперимент на Scala:
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
должен соответствовать типу A.c
, потому что первый перекрывает второй.
Вопрос 1:
Где в SLS указано правило, из которого следует, что тип O1.c
действительно соответствует типу A.c
?
Так почему же 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
be O2.C
согласно SLS?
Обновление:
Каков тип значения O1.c
и члена абстрактного значения A.c
в соответствии с SLS?