クラスにJava.lang.Comparable
を実装した場合でも、equals()
メソッドをオーバーライドする必要がありますか?または、Comparable
はequals
でも機能しますか?
答えがnoの場合、何らかの不一致が発生した場合はどうなりますか? equals()
メソッド内で2つのオブジェクトを等しいと見なす方法が、Comparable
のcompareTo()
内で同じクラスの2つのオブジェクトを等しいと呼ぶ方法とは異なるとします。 。
さらに、Comparable
を実装する場合、equals()
もオーバーライドする必要がありますか?
a.compareTo(b) == 0
を持つことはa.equals(b)
(およびその逆)を意味することが推奨されます(そしてかなり賢明です)が、そうではありませんnot必須。 Comparable
は、一連のオブジェクトで順序付けを実行するときに使用することを目的としていますが、equals()
は真っ直ぐな同等性をテストするだけです。
このリンクcompareTo
を適切に実装するためのいくつかの良い情報があります。
Java.lang.Comparable のJavadocから:
自然な順序が等しいと一致していることを強くお勧めします(必須ではありません)。
推奨されていますが、.equals()
と.compareTo()
の動作が同じである必要はありません。
BigDecimal APIを見てください: http://download.Oracle.com/javase/1,5.0/docs/api/Java/math/BigDecimal.html#equals(Java.lang.Object)
Equals()メソッド内で2つのオブジェクトを等しいと見なす方法が、ComparableのtoCompare()内で同じクラスの2つのオブジェクトを等しいと呼ぶ方法とは異なるとしましょう。
これを行い、それらのオブジェクトをソートされたセットに入れると、セットは誤動作します。 SortedSetのドキュメントから :
ソートされたセットがSetインターフェースを正しく実装するためには、ソートされたセットによって維持される順序(明示的なコンパレーターが提供されているかどうかに関係なく)はequalsと一致している必要があることに注意してください。
たとえば、 TreeSet には、(誤って)2つのオブジェクトが含まれている可能性があります。
a.compareTo(b) != 0
たとえ
a.equals(b) == true