В качестве теста я написал этот код:
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, которая работает для f (null), является f (x: String). Но тогда, если Int не может быть нулевым, что означает значение null.asInstanceOf [Int]? Repl говорит это типа Int:
scala> :type null.asInstanceOf[Int]
Int
но я действительно не вижу, как это работает. В конце концов, если я попытаюсь применить String к 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 работает? Предположительно бокс в той или иной форме, но тип все еще Int, который не может быть нулевым...
Что мне не хватает?