3

Scala REPL (Scala 2.9.1) で少し遊んでみたところ、isInstanceOf メソッドで驚くべき結果が得られました。

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 つの結果を説明できる人はいますか?

4

2 に答える 2

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 によって提供されるジェネリック メカニズムの一般的な機能/制限です。詳細については、型消去を参照してください。

于 2012-06-14T21:21:51.040 に答える
5

これは、 List の Int 型パラメーターを、見つけられる最も一般的な型バインドに置き換える型消去によるものです。この場合は、scala.Any だと思います。

これらも true になることに注意してください。

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 を使用してこの単純なクラスを逆アセンブルすると、実際には List[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();
}
于 2012-06-14T21:33:59.507 に答える