为什么`Array(0,1,2)== Array(0,1,2)`没有返回预期的结果?

时间:2010-03-19 23:25:37

标签: arrays scala equals equality

据我了解,Scala的==定义了两个对象的自然相等。

我希望Array(0,1,2) == Array(0,1,2)比较自然平等。例如,检查数组的所有元素在与另一个数组的相应元素进行比较时是否返回true。

人们告诉我,Scala的Array只是一个Java [],只比较身份。覆盖Array的{​​{1}}方法来比较自然平等会不会更有意义?

3 个答案:

答案 0 :(得分:20)

Scala 2.7尝试向Java []数组添加功能,并遇到了有问题的极端情况。 Scala 2.8声明Array[T]T[],但它提供了包装器和等价物。

在2.8中尝试以下内容(编辑/注释:从RC3开始,GenericArrayArraySeq - 感谢使用反义词指出这一点:

import scala.collection.mutable.{GenericArray=>GArray, WrappedArray=>WArray}
scala> GArray(0,1,2) == GArray(0,1,2)
res0: Boolean = true

scala> (Array(0,1,2):WArray[Int]) == (Array(0,1,2):WArray[Int])
res1: Boolean = true

GenericArray就像Array一样,除了添加了所有Scala集合的好东西。WrappedArray包装了Java []数组;上面,我给它一个普通的数组(比调用隐式转换函数更容易),然后比较包装的数组。这些包装器虽然由[]数组支持,但也为您提供了所有收集的好东西。

答案 1 :(得分:8)

Scala不会覆盖Array的相等性,因为它不可能。在子类化时,只能覆盖方法。由于Array没有被子类化(这是不可能的),Scala不能覆盖它的方法。

答案 2 :(得分:5)

  

但Scala的String也只是一个Java   字符串,但Scala覆盖等于   比较自然平等。

Scala不会覆盖那里的任何东西; java.lang.String具有equals()的依赖于值的实现(与许多其他Java类一样,但与数组不同)。