2013-10-30 5 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은 유형 t에 대해 명확한 값이없는 A 유형으로 변환됩니다. 추상 클래스가 C 인 예제에서 인스턴스 ct에 대한 콘크리트 유형이 aInta의 값을 대체합니다. 즉, cC의 인스턴스가 아니며 익명 하위 클래스의 인스턴스입니다.

나는 첫 번째 경우와 같은 오류가 c 다음 명시 적으로 C로의 유형 알리는 예를 변경하는 경우 :

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 
        ^