为什么可以将Unit数组设置为null?

3

Unit被指定为AnyVal的子类型(它的唯一值是()),那么为什么会出现这种情况:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

这只是REPL数组打印机制中的一个错误/遗漏,还是有其他原因呢?

3个回答

4

空值(null)只应该出现在这个字符串表达式中。一旦你从数组中获取一个值,它就会被“拆箱”为Unit

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)

scala> units(0)
// note: no result

与之比较:

scala> val refs = new Array[AnyRef](5)
refs: Array[AnyRef] = Array(null, null, null, null, null)

scala> refs(0)                        
res0: AnyRef = null // we do get the null here

那个问题中,有一个类似的讨论,只是使用了Nothing而不是Unit


我不确定Unit值是否被取消装箱:(new Array[Unit](5))(0) == () 返回 false。而 (new Array[Unit](5))(0) == null 返回 true 和一个有趣的警告!{val a = Array.fill(5)(()); a(0) == ()} 将返回 true - huynhjl

3

我认为这是数组初始化的一个问题/限制。对于原始值数组,由于Scala数组利用本地数组,JVM会默认将其初始化为它们的默认值。

对于其他类型,该值将被包装成对象,似乎它们初始化为null。

如果您想要一个单位数组,您可能需要调用val units = Array.fill(5)(())


1

这个问题在Scala 2.9中已经修复,现在输出如下:

scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接