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

时间:2014-05-26 23:37:13

标签: 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()

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

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

// scala                   compiles as such Java           is equal to
Array.empty == Array() === Array.empty.equals(Array()) === false

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

java.util.Arrays.equals(Array.empty, Array()) === true

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