为什么单位数组可以保持为空?

时间:2011-05-02 00:29:00

标签: arrays scala null read-eval-print-loop unit-type

Unit被指定为AnyVal的子类型(其唯一值为()),为什么可能这样做:

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

这只是REPL阵列打印机制中的错误/遗漏,还是有原因的呢?

3 个答案:

答案 0 :(得分:3)

我认为这是阵列初始化的问题/限制。对于原始值,数组被初始化为其默认值,由JVM根据利用本机数组的Scala数组推定。

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

如果您需要一组单位,可能需要拨打val units = Array.fill(5)(())

答案 1 :(得分:3)

据推测,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

that questionNothing而不是Unit进行了类似的讨论。

答案 2 :(得分:1)

它已针对Scala 2.9修复,现在打印:

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