Array.empty == Array()给出false但两者看起来都是类型和值相等的?

Jac*_*ski 2 scala

在审查代码更改时,我发现Array.empty并不是Array()说我会考虑更多的惯用语.然后我惊讶地发现==他们给出false了他们看起来相同的类型和价值方面.

scala> Array.empty == Array()
res1: Boolean = false

scala> Array.empty
res2: Array[Nothing] = Array()

scala> Array()
res3: Array[Nothing] = Array()
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么会这样?

Kon*_*ski 5

这实际上更像是一个Java问题.因为在Java中,Scala Array正在使用它,所以数组相等是身份相等.

// scala                   compiles as such Java           is equal to
Array.empty == Array() === Array.empty.equals(Array()) === false
Run Code Online (Sandbox Code Playgroud)

根据结构检查数组相等性的正确方法是:

java.util.Arrays.equals(Array.empty, Array()) === true
Run Code Online (Sandbox Code Playgroud)

数组是JVM上非常特殊的野兽 - 直觉通常会失败.Scala必须继承这个定义,以保持与Java的兼容性.

  • 实际上,测试编译为`BoxesRunTime.equals`.那里可以实施特殊平等.您可以通过在结果的构造函数中输入`Array(1)`然后`:javap -`来查看Scala数组是Java数组. (2认同)