作为测试,我写了这段代码:
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] 是什么意思?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 也不能,那么为什么将 null 转换为 Int 工作呢?大概是某种形式的装箱,但是类型仍然是Int,不能为null...
我错过了什么?