Why does `Array(0,1,2) == Array(0,1,2)` not return the expected result?

后端 未结 3 1123
再見小時候
再見小時候 2020-11-30 05:33

As far as I understand, Scala\'s == defines the natural equality of two objects.

I expected that Array(0,1,2) == Array(0,1,2) compares the

相关标签:
3条回答
  • 2020-11-30 06:22

    Scala 2.7 tried to add functionality to Java [] arrays, and ran into corner cases that were problematic. Scala 2.8 has declared that Array[T] is T[], but it provides wrappers and equivalents.

    Try the following in 2.8 (edit/note: as of RC3, GenericArray is ArraySeq--thanks to retronym for pointing this out):

    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 acts just like Array, except with all the Scala collections goodies added in. WrappedArray wraps Java [] array; above, I've cast a plain array to it (easier than calling the implicit conversion function) and then compared the wrapped arrays. These wrappers, though backed by a [] array, also give you all the collection goodies.

    0 讨论(0)
  • 2020-11-30 06:23

    Scala doesn't override Array's equality because it's not possible. One can only override methods when subclassing. Since Array isn't being subclassed (which isn't possible), Scala cannot override its methods.

    0 讨论(0)
  • 2020-11-30 06:29

    But Scala's String is also just a Java String but Scala overrides equals to compare natural equality.

    Scala doesn't override anything there; java.lang.String has a value-dependant implementation of equals() (like many other Java classes, but unlike arrays).

    0 讨论(0)
提交回复
热议问题