可能重复:
If an Int can't be null, what does null.asInstanceOf[Int] mean?
我在REPL中尝试了以下内容:
scala> null.asInstanceOf[Int] res12: Int = 0 scala> null.asInstanceOf[Float] res13: Float = 0.0 scala> null.asInstanceOf[Double] res14: Double = 0.0
在这种情况下,它会期望运行时异常(NPE
或ClassCastException
)
任何人都可以解释为什么 Scala将null
强制转换为零?
答案 0 :(得分:5)
这真的很奇怪,因为它不是根据规范预期的行为:
如果asInstanceOf[T]
符合,
null
会返回T
个对象scala.AnyRef
,并以其他方式抛出NullPointerException
。
答案 1 :(得分:3)
原因是null
是引用类型 - 转换始终转换为其他引用类型 - 在本例中为Int
或Double
的装箱版本。
在下一步中,编译器将装箱对象转换为原始值。如果装箱Int
对象为null
,则其对应的默认原始值为0
。
请参阅:If an Int can't be null, what does null.asInstanceOf[Int] mean?
答案 2 :(得分:1)
这些类型都扩展了AnyVal,其值不能通过赋值为null,为什么它在响应asInstanceOf时将它们变为零但是让我失望。它似乎只是在REPL中这样做,但这是一个稍微特殊的情况。在实际代码中,它返回null。