отношения между зависимыми от пути внутренними типами в Scala

Предупреждение: я делаю кросс-постинг из #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

person Yuvi Masory    schedule 22.06.2010    source источник
comment
Выглядит как ошибка для меня, но это может быть результатом стирания. Сопоставление, которое предпочтительнее, чем isInstanceOf/asInstanceOf, работает должным образом.   -  person Daniel C. Sobral    schedule 23.06.2010


Ответы (1)


o1.Inner и o2.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] = [email protected]#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] = [email protected]#Outer$Inner

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

и o1.in.isInstanceOf[o2.Inner] может только проверить, что o1.in является экземпляром стирания o2.Inner.

person Alexey Romanov    schedule 22.06.2010