类值参数的类型成员类型不匹配

时间:2013-10-30 15:05:14

标签: scala type-members

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

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

这种行为的原因是什么?

1 个答案:

答案 0 :(得分: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 ^ 的示例,那么我会得到与第一种情况相同的错误:

{{1}}
相关问题