【发布时间】:2012-05-31 17:12:39
【问题描述】:
作为测试,我写了这段代码:
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……
我错过了什么?
【问题讨论】:
-
哦,我自己怎么能进一步理解这一点,使用 REPL 或 scalap 或一些神奇的编译器标志或...?
-
另一个类似的question...
-
查看最近的规范更新github.com/scala/scala-dist/pull/20 和问题issues.scala-lang.org/browse/SI-4437,其中解释了一些背景故事。它有点类似于 C# 中的
default(T),afaik。