equals

equals について補足。Java ではインスタンスの比較に == か equals を用いるわけだけど、どちらもデフォルトでは参照の同値性、つまり同一性を比較する。すなわち、"a" == "a" は常に false を返す。また、new Object().equals(new Object()) も、常に false を返す。

とまぁここまではいいとして、これらには値としての同値性(以下同値性)を調べるという部分がすっぽりと抜けている。Java ではそういうことがしたいなら equals をオーバーライドせよということになっている。

いやいや待てと。equals ってのはそもそも同一性を調べるメソッドなのであって、同値性を調べるメソッドではないでしょう。メソッドの意味を大きく変更することになるオーバーライドはするべきではない。

ちげぇ。
まずひとつ。試せば分かるけど、Java では "a" == "a" は常に true。プログラム中の文字列リテラルは intern されたオブジェクトになるから。
もうひとつ。equals はもともと同値性(equality)を調べるメソッド。きちんとドキュメントにそう記述されている。単に、java.lang.Object では同値の定義に同一性を使っているだけだ。
もう一個。

同値性の比較が可能なインタフェース(Comparable)

同一性の判定ができることと、順序がつけられることでは意味が違う。Haskell でも Ord と Eq は別物だし。