据我了解,Scala==
定义了两个对象的自然平等。
我料想那Array(0,1,2) == Array(0,1,2)
比自然平等。例如,检查数组的所有元素在与另一个数组的对应元素比较时是否返回 true。
人们告诉我,ScalaArray
只是一个[]
只比较身份的 Java。Array
重写'equals
方法来比较自然相等不是更有意义吗?
Scala 2.7 试图向 Java[]
数组添加功能,但遇到了有问题的极端情况。Scala 2.8 已经声明了Array[T]
is T[]
,但它提供了包装器和等价物。
在 2.8 中尝试以下操作(编辑/注意:从 RC3 开始,GenericArray
是ArraySeq
--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[]
数组;上面,我向它投射了一个普通数组(比调用隐式转换函数更容易),然后比较了包装的数组。这些包装器虽然由[]
数组支持,但也为您提供了所有收藏品。
Scala 不会覆盖 Array 的相等性,因为这是不可能的。子类化时只能覆盖方法。由于 Array 没有被子类化(这是不可能的),Scala 不能覆盖它的方法。
但是 Scala 的 String 也只是一个 Java String 但 Scala 覆盖 equals 来比较自然相等。
Scala 没有覆盖那里的任何东西。java.lang.String
具有值依赖的实现equals()
(与许多其他 Java 类一样,但与数组不同)。