テストとして、私はこのコードを書きました:
object Ambig extends App {
def f( x:Int ) { println("Int" ) }
def f( x:String ) { println("String") }
f( null.asInstanceOf[Int ] )
f( null.asInstanceOf[String] )
f(null)
}
f()の最後の呼び出しで、あいまいであるというエラーが発生することを期待していました。コンパイラーはそれを受け入れ、次の出力を生成しました。
Int
String
String
これは、IntがAnyRefではないという事実に関係していると推測しているので、f(null)で機能するfのバージョンはf(x:String)のみです。しかし、Intをnullにできない場合、null.asInstanceOf [Int]はどういう意味ですか?担当者は、それがInt型であると言っています。
scala> :type null.asInstanceOf[Int]
Int
しかし、それがどのように機能するのかはよくわかりません。結局のところ、文字列をIntにキャストしようとすると、すべての地獄が解き放たれます。
scala> "foo".asInstanceOf[Int]
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(Unknown Source)
...
もちろん、それは当然のことです。「foo」をIntにすることはできません。しかし、どちらもnullにできないので、なぜintにnullをキャストするのですか?おそらく何らかの形でボクシングをしていますが、型はまだIntであり、nullにすることはできません...
私は何が欠けていますか?