9

警告:我从#scala 交叉发布

《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

1 回答 1

11

o1.Innero2.Inner是不同的类型,但它们的擦除是相同的:

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

scala> val o1 = new Outer
o1: Outer = Outer@1d16ecf

scala> val m1 = implicitly[Manifest[o1.Inner]]
m1: Manifest[o1.Inner] = Outer@1d16ecf.type#Outer$Inner

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

scala> val o2 = new Outer
o2: Outer = Outer@138ef1d

scala> val m2 = implicitly[Manifest[o2.Inner]]
m2: Manifest[o2.Inner] = Outer@138ef1d.type#Outer$Inner

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

并且o1.in.isInstanceOf[o2.Inner]只能检查这o1.in是擦除的一个实例o2.Inner

于 2010-06-22T22:59:46.750 回答