Why doesn’t Array’s == function return true for Array(1,2) == Array(1,2)?

It is true that the explanation offered in the book is questionable, but to be fair it was more believable when they wrote it. It’s still true in 2.8, but we have to retrofit different reasoning because as you’ve noticed, all the other collections do element comparisons even if they’re mutable.

A lot of blood had been shed trying to make Arrays seem like the rest of the collections, but this was a tremendously leaky abstraction and in the end it was impossible. It was determined, correctly I think, that we should go to the other extreme and supply native arrays the way they are, using implicit machinery to enhance their capabilities. Where this most noticeably falls down is toString and equals, because neither of them behaves in a reasonable fashion on Arrays, but we cannot intercept those calls with implicit conversions because they are defined on java.lang.Object. (Conversions only happen when an expression doesn’t type check, and those always type check.)

So you can pick your explanation, but in the end arrays are treated fundamentally differently by the underlying architecture and there’s no way to paper over that without paying a price somewhere. It’s not a terrible situation, but it is something you have to be aware of.

Leave a Comment