2010-06-22 23 views
9

Cảnh báo: Tôi đang đăng chéo từ #scalamối quan hệ giữa các loại nội bộ phụ thuộc vào đường dẫn trong Scala

10 Sách Lập trình trong Scala quy định rằng loại phụ thuộc vào đường dẫn khác nhau tùy thuộc vào trường hợp chính xác của đường dẫn được đề cập . Nếu như vậy, tôi không hiểu tại sao tất cả các vị từ sau trở thành sự thật:

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

Trông giống như một lỗi đối với tôi, nhưng nó có thể là kết quả của việc xóa. Kết hợp, được ưu tiên hơn isInstanceOf/asInstanceOf, hoạt động như mong đợi. –

Trả lời

11

o1.Innero2.Inner nhiều loại khác nhau, nhưng tẩy xóa của họ đều giống nhau:

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] chỉ có thể kiểm tra o1.in là một ví dụ về việc xóa của o2.Inner.

Các vấn đề liên quan