Несоответствие типов для членов типа параметра значения класса

Почему использование членов типа, привязанных к параметрам значения класса, приводит к ошибке «несоответствие типа»? Например:

scala> class A { type t }
defined class A

scala> class B(val a: A)
defined class B

scala> val aInt = new A { type t = Int }
aInt: A{type t = Int} = $anon$1@6ccc7368

scala> val b = new B(aInt)
b: B = B@834518

scala> val i: b.a.t = 1
<console>:11: error: type mismatch;
 found   : Int(1)
 required: b.a.t
       val i: b.a.t = 1
                      ^

Странно то, что когда я использую значение, которое не определено как параметр класса, все работает нормально:

scala> abstract class C { val a: A }
defined class C

scala> val c = new C { val a = aInt }
c: C{val a: A{type t = Int}} = $anon$1@1e815aad

scala> val i: c.a.t = 1
i: c.a.t = 1

В чем причина такого поведения?


person ps_ttf    schedule 30.10.2013    source источник


Ответы (1)


Кажется, я понял, что происходит. В примере с классом B значение a преобразуется в тип A, который не имеет определенного значения для типа t. В примере с абстрактным классом C экземпляр c переопределяет значение a с помощью aInt, который имеет конкретный тип для t. Другими словами, c не является экземпляром C: это экземпляр его анонимного подкласса.

Если я изменю пример, явно указав тип c на C, то получу ту же ошибку, что и в первом случае:

scala> class A { type t }
defined class A

scala> val aInt = new A { type t = Int }
aInt: A{type t = Int} = $anon$1@3b8590c5

scala> abstract class C { val a: A }
defined class C

scala> val c: C = new C { val a = aInt }
c: C = $anon$1@5f14a3c6

scala> val i: c.a.t = 1
<console>:11: error: type mismatch;
 found   : Int(1)
 required: c.a.t
       val i: c.a.t = 1
                      ^
person ps_ttf    schedule 30.10.2013