26

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

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

人们告诉我,ScalaArray只是一个[]只比较身份的 Java。Array重写'equals方法来比较自然相等不是更有意义吗?

4

3 回答 3

20

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

在 2.8 中尝试以下操作(编辑/注意:从 RC3 开始,GenericArrayArraySeq--thanks to retroonym 指出这一点):

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[]数组;上面,我向它投射了一个普通数组(比调用隐式转换函数更容易),然后比较了包装的数组。这些包装器虽然由[]数组支持,但也为您提供了所有收藏品。

于 2010-03-20T00:26:15.787 回答
9

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

于 2010-03-20T01:22:01.147 回答
5

但是 Scala 的 String 也只是一个 Java String 但 Scala 覆盖 equals 来比较自然相等。

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

于 2010-03-19T23:35:49.703 回答