2010-06-22 10 views
9

경고 : 나는 #scala에서 교차 게시하도록하겠습니다관계는

스칼라의 책 프로그래밍 경로에 의존하는 유형이 해당 경로의 정확한 예에 따라 다르다는 것을 주장 . 그렇다면, 다음의 모든 조건이 true를 돌려 왜 이해가 안 :

class Outer { 
    val in = new Inner 
    class Inner 
} 

val o1 = new Outer 
val o2 = new Outer 

o1.in.isInstanceOf[Outer#Inner] //makes perfect sense 
o1.in.isInstanceOf[o1.Inner] //still makes sense, the path-dependent type is o1's own 
o1.in.isInstanceOf[o2.Inner] //why is this true? PiS p.423 says the path-dependent types are different, they only share a common supertype Outer#Inner 
+4

나에게 버그처럼 보이지만 지우는 결과 일 수 있습니다. isInstanceOf/asInstanceOf보다 선호되는 일치는 예상대로 작동합니다. –

답변

11

o1.Innero2.Inner는 다른 유형이지만, 자신의 소거은 동일합니다 :

scala> class Outer { 
    | val in = new Inner 
    | class Inner 
    | } 
defined class Outer 

scala> val o1 = new Outer 
o1: Outer = [email protected] 

scala> val m1 = implicitly[Manifest[o1.Inner]] 
m1: Manifest[o1.Inner] = [email protected]#Outer$Inner 

scala> m1.erasure 
res0: java.lang.Class[_] = class Outer$Inner 

scala> val o2 = new Outer 
o2: Outer = [email protected] 

scala> val m2 = implicitly[Manifest[o2.Inner]] 
m2: Manifest[o2.Inner] = [email protected]#Outer$Inner 

scala> m2.erasure 
res1: java.lang.Class[_] = class Outer$Inner 

o1.in.isInstanceOf[o2.Inner]에만 있음을 확인할 수 있습니다 o1.ino2.Inner의 삭제 인스턴스입니다.

관련 문제