3

为什么使用绑定到类值参数的类型成员会产生“类型不匹配”错误?例如:

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

这种行为的原因是什么?

4

1 回答 1

1

好像我已经明白发生了什么。在带有 class 的示例中,Ba被转换为 typeA没有明确值的 type t。在具有抽象类C的示例中,实例c覆盖了a具有aInt具体类型的值t。换句话说,cis 不是一个实例C:它是它的匿名子类的一个实例。

如果我更改了明确说明cas类型的示例,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
                      ^
于 2013-10-30T15:21:22.383 回答