2012-06-14 3 views
3

Как я играл немного с Scala РЕПЛ (Scala 2.9.1) Я увидел удивительный результат с помощью метода isInstanceOf:Почему List [Int] является экземпляром List [Boolean]?

scala> val l = List[Int](1, 2, 3) 
l: List[Int] = List(1, 2, 3) 

scala> l.isInstanceOf[List[Int]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res3: Boolean = true 

scala> l.isInstanceOf[List[String]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res4: Boolean = true 

scala> l.isInstanceOf[List[Boolean]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res5: Boolean = true 

Может кто-нибудь объяснить последние два результата?

+2

Тип стирание. См. Также http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens – Geo

+5

"перезапустить с помощью -включено для получения дополнительной информации". Вы делали это? –

+0

Чтобы обвинить себя: нет, я этого не сделал. Я не мог понять, как это сделать. Если я использую «compile -unchecked» в оболочке sbt, он не знает эту опцию. Где я должен разместить этот вариант? –

ответ

11

повторный запуск с -unchecked:

scala> l.isInstanceOf[List[Int]] 
<console>:9: warning: non variable type-argument Int in type List[Int] is 
unchecked since it is eliminated by erasure 
       l.isInstanceOf[List[Int]] 
         ^

Конкретный тип объекта просто не известно во время выполнения. Это общая функция/ограничение механизма генериков, предоставляемого JVM. См. Type erasure для получения дополнительной информации.

5

Это связано с стиранием типа, которое заменяет параметр типа Int в списке наиболее общим типом, который он может найти. В этом случае я считаю, что это scala.Any.

Примечание они также дают верно:

scala> l.isInstanceOf[List[scala.Nothing]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res0: Boolean = true 

scala> l.isInstanceOf[List[Any]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res1: Boolean = true 

scala> l.isInstanceOf[List[Object]] 
warning: there were 1 unchecked warnings; re-run with -unchecked for details 
res2: Boolean = true 

Использование javap разобрать этот простой класс, который мы можем видеть, что не существует на самом деле нет универсального типа в списке [Int]:

class Bar{ 
    val list = List[Int](1,2,3) 
} 

разобранный код scala:

public class Bar extends java.lang.Object implements scala.ScalaObject{ 
    public scala.collection.immutable.List list(); 
    public Bar(); 
} 
Смежные вопросы