2013-10-30 113 views
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} = [email protected] 

scala> val b = new B(aInt) 
b: B = [email protected] 

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}} = [email protected] 

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

什么是对这种行为的原因是什么?

回答

1

看起来像我明白发生了什么。在类B的示例中,值a转换为类型A,该类型对于类型t没有明确的值。在抽象类C的示例中,实例c覆盖aaInt的值,其具有t的具体类型。换句话说,c不是C的实例:它是它的匿名子类的一个实例。

如果我改变的例子说明的cC明确然后我得到了同样的错误在第一种情况下类型:

scala> class A { type t } 
defined class A 

scala> val aInt = new A { type t = Int } 
aInt: A{type t = Int} = [email protected] 

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

scala> val c: C = new C { val a = aInt } 
c: C = [email protected] 

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 
        ^
相关问题