Unit
被指定为AnyVal
的子类型(其唯一值为()
),为什么可能这样做:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array(null, null, null, null, null)
这只是REPL阵列打印机制中的错误/遗漏,还是有原因的呢?
答案 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 question与Nothing
而不是Unit
进行了类似的讨论。
答案 2 :(得分:1)
它已针对Scala 2.9修复,现在打印:
scala> val units = new Array[Unit](5)
units: Array[Unit] = Array((), (), (), (), ())