在Scala中将null转换为Int和Double

时间:2012-07-05 06:36:42

标签: scala casting null

  

可能重复:
  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

在这种情况下,它会期望运行时异常(NPEClassCastException) 任何人都可以解释为什么 Scala将null强制转换为零?

3 个答案:

答案 0 :(得分:5)

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

  如果asInstanceOf[T]符合,

null会返回T个对象   scala.AnyRef,并以其他方式抛出NullPointerException

     

- The Scala Language Specification, Version 2.9,p。 75。

这是一个known bug已关闭,但与this one相关,已打开。

答案 1 :(得分:3)

原因是null是引用类型 - 转换始终转换为其他引用类型 - 在本例中为IntDouble的装箱版本。

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

请参阅:If an Int can't be null, what does null.asInstanceOf[Int] mean?

答案 2 :(得分:1)

这些类型都扩展了AnyVal,其值不能通过赋值为null,为什么它在响应asInstanceOf时将它们变为零但是让我失望。它似乎只是在REPL中这样做,但这是一个稍微特殊的情况。在实际代码中,它返回null。