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

soc*_*soc 26 arrays scala equality equals

据我所知,Scala ==定义了两个对象的自然相等.

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

人们告诉我,Scala Array只是一个[]只比较身份的Java .改写覆盖比较自然平等Arrayequals方法不是更有意义吗?

Rex*_*err 20

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • `GenericArray`现在称为`ArraySeq` (2认同)

Dan*_*ral 8

Scala不会覆盖Array的相等性,因为它不可能.在子类化时,只能覆盖方法.由于Array未被子类化(这是不可能的),因此Scala无法覆盖其方法.


Mic*_*rdt 5

但Scala的String也只是一个Java String,但Scala覆盖等于比较自然相等.

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

  • Scala将`==`解释为`equals`.就这样.`String`有一个`equals`,可以做一些与引用标识有用的东西.`[]`没有. (3认同)