【问题标题】:Why can an Array of Units hold null?为什么单位数组可以为空?
【发布时间】:2011-05-02 00:29:00
【问题描述】:

Unit 被指定为AnyVal 的子类型(并且它的唯一值是()),那么为什么会这样:

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

这只是 REPL 的数组打印机制中的错误/遗漏还是有原因?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我不确定 Unit 值是否被拆箱:(new Array[Unit](5))(0) == () 返回false(new Array[Unit](5))(0) == null 返回 true 和一个有趣的警告! {val a = Array.fill(5)(()); a(0) == ()} 将返回 true
    【解决方案2】:

    我认为这是数组初始化的问题/限制。对于原始值,数组被初始化为其默认值,我假设 JVM 凭借 Scala 数组利用本机数组。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        相关资源
        最近更新 更多