¿Por qué `Array (0,1,2) == Array (0,1,2)` no devuelve el resultado esperado?

Por lo que yo entiendo, Scala == define la igualdad natural de dos objetos.

Esperaba que Array(0,1,2) == Array(0,1,2) comparara la igualdad natural. Por ejemplo, comprueba si todos los elementos de la matriz devuelven verdadero cuando se compara con los elementos correspondientes de la otra matriz.

La gente me dijo que Scala’s Array es solo una Java [] que solo compara identidad. ¿No sería más significativo anular el método de igualdad de Array para comparar la igualdad natural en su lugar?

Scala 2.7 intentó agregar funcionalidad a matrices Java [] , y se encontró con casos de esquina problemáticos. Scala 2.8 ha declarado que Array[T] es T[] , pero proporciona envoltorios y equivalentes.

Intente lo siguiente en 2.8 (editar / nota: a partir de RC3, GenericArray es ArraySeq –gracias a recuperarlo para señalar esto):

 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 actúa como Array , excepto con todos los WrappedArray la colección Scala añadidos. WrappedArray envuelve Java [] array; más arriba, le eché una matriz simple (más fácil que llamar a la función de conversión implícita) y luego comparé las matrices envueltas. Estas envolturas, aunque respaldadas por una matriz [] , también le brindan todos los objetos de colección.

Scala no anula la igualdad de Array porque no es posible. Uno solo puede anular los métodos al crear subclases. Como Array no está siendo subclasificado (lo cual no es posible), Scala no puede anular sus métodos.

Pero Scala’s String también es solo un Java String, pero Scala reemplaza a los iguales para comparar la igualdad natural.

Scala no anula nada allí; java.lang.String tiene una implementación dependiente del valor de equals() (como muchas otras clases de Java, pero a diferencia de las matrices).