我在 REPL 中尝试了以下操作:
scala> null.asInstanceOf[Int] res12: 整数 = 0 scala> null.asInstanceOf[Float] res13: 浮点数 = 0.0 scala> null.asInstanceOf[双] res14: 双倍 = 0.0
在这种情况下,它会出现运行时异常(NPE
或ClassCastException
)。
谁能解释为什么Scala 强制null
为零?
我在 REPL 中尝试了以下操作:
scala> null.asInstanceOf[Int] res12: 整数 = 0 scala> null.asInstanceOf[Float] res13: 浮点数 = 0.0 scala> null.asInstanceOf[双] res14: 双倍 = 0.0
在这种情况下,它会出现运行时异常(NPE
或ClassCastException
)。
谁能解释为什么Scala 强制null
为零?
这真的很奇怪,因为这不是规范所期望的行为:
asInstanceOf[T]
如果符合 则返回null
对象本身,否则抛出 a 。T
scala.AnyRef
NullPointerException
-- Scala 语言规范,版本 2.9,p。75.
原因是这null
是一个引用类型——强制转换总是转换为另一个引用类型——在这种情况下是Int
or的盒装版本Double
。
在下一步中,编译器将装箱对象转换为原始值。如果装箱Int
对象是null
,则其对应的默认原始值是0
。
这些类型都扩展了 AnyVal,其值不能通过赋值为 null,但它响应 asInstanceOf 将它们变为零的原因却让我无法理解。它似乎只在 REPL 中这样做,但这是一个稍微特殊的情况。在实际代码中,它返回 null。