10

可能重复:
如果 Int 不能为 null,那么 null.asInstanceOf[Int] 是什么意思?

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

scala> null.asInstanceOf[Int]
res12: 整数 = 0

scala> null.asInstanceOf[Float]
res13: 浮点数 = 0.0

scala> null.asInstanceOf[双]
res14: 双倍 = 0.0

在这种情况下,它会出现运行时异常(NPEClassCastException)。
谁能解释为什么Scala 强制null为零?

4

3 回答 3

6

这真的很奇怪,因为这不是规范所期望的行为:

asInstanceOf[T]如果符合 则返回null对象本身,否则抛出 a 。Tscala.AnyRefNullPointerException

-- Scala 语言规范,版本 2.9,p。75.

这是一个已知的错误,它已关闭但与这个开放的错误相关。

于 2012-07-05T06:49:05.440 回答
3

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

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

请参阅:如果 Int 不能为 null,那么 null.asInstanceOf[Int] 是什么意思?

于 2012-07-05T11:11:00.833 回答
1

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

于 2012-07-05T06:51:19.257 回答