Unit
被指定为AnyVal
的子类型(它的唯一值是()
),那么为什么会出现这种情况:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
这只是REPL数组打印机制中的一个错误/遗漏,还是有其他原因呢?
Unit
被指定为AnyVal
的子类型(它的唯一值是()
),那么为什么会出现这种情况:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
这只是REPL数组打印机制中的一个错误/遗漏,还是有其他原因呢?
空值(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
。
我认为这是数组初始化的一个问题/限制。对于原始值数组,由于Scala数组利用本地数组,JVM会默认将其初始化为它们的默认值。
对于其他类型,该值将被包装成对象,似乎它们初始化为null。
如果您想要一个单位数组,您可能需要调用val units = Array.fill(5)(())
。
这个问题在Scala 2.9中已经修复,现在输出如下:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())
(new Array[Unit](5))(0) == ()
返回false
。而(new Array[Unit](5))(0) == null
返回true
和一个有趣的警告!{val a = Array.fill(5)(()); a(0) == ()}
将返回true
。 - huynhjl