在Scala中将null强制转换为Int和Double

在Scala中将null强制转换为Int和Double,scala,casting,null,Scala,Casting,Null,可能重复: 我在REPL中尝试了以下操作: scala> null.asInstanceOf[Int] res12: Int = 0 scala> null.asInstanceOf[Float] res13: Float = 0.0 scala> null.asInstanceOf[Double] res14: Double = 0.0 scala>null.asInstanceOf[Int] res12:Int=0 scala>null.asInstanceOf[Float] res1

可能重复:

我在REPL中尝试了以下操作:

scala> null.asInstanceOf[Int] res12: Int = 0 scala> null.asInstanceOf[Float] res13: Float = 0.0 scala> null.asInstanceOf[Double] res14: Double = 0.0 scala>null.asInstanceOf[Int] res12:Int=0 scala>null.asInstanceOf[Float] res13:浮动=0.0 scala>null.asInstanceOf[Double] res14:Double=0.0 在这种情况下,会出现运行时异常(
NPE
ClassCastException

有人能解释为什么Scala将
null
强制转换为零吗?

这真的很奇怪,因为根据规范,这不是预期的行为:

asInstanceOf[T]
如果
T
符合以下条件,则返回
null
对象本身
scala.AnyRef
,否则抛出
NullPointerException

--,p。七十五


它是一个封闭的,但与之相关的,是开放的。

这些类型都扩展了AnyVal,对于AnyVal,赋值不能为null,我不明白为什么它会将它们变成零来响应一个instanceof。它似乎只在REPL中执行此操作,但这是一个稍微特殊的情况。在实代码中,它返回null。

原因是
null
是一种引用类型-强制转换总是转换为另一种引用类型-在这种情况下是
Int
Double
的盒装版本

在下一步中,编译器将装箱对象转换为基本值。如果装箱的
Int
对象为
null
,则其对应的默认原语值为
0


请参阅:

我自己没有在“真实”代码中尝试,但这是我的同事在“真实”代码中注意到的行为。谢谢。它是否符合语言规范?不确定在默认值之间转换的部分。是的,这部分看起来与规范相矛盾(参见Nicolas的回答)好的,完整的示例
val x=null。asInstanceOf[String]