3

メソッドがすでにクラスに実装されているのに、なぜequals()メソッドが抽象化されたのですか?java.util.ComparatorObject

4

1 に答える 1

5

まず、メソッドが「抽象化」されていないことに注意してください。を実装Comparator<T>せずに実装するequals()と、コードコンパイルされます。クラスは、 によって提供される実装を使用するだけObjectです。

メソッドを再宣言する理由については、 の契約がComparator<T>.equals()の契約よりも厳しいためObject.equals()です。これはドキュメントで説明されています:

さらに、このメソッドは、指定されたオブジェクトがコンパレーターでもあり、このコンパレーターと同じ順序を課す場合にのみ true を返すことができます。したがって、comp1.equals(comp2) は、すべてのオブジェクト参照 o1 および o2 に対して sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) を意味します。

Comparatorがオーバーライドされていない場合、のコントラクトが のコントラクトと異なるequals()ことを指定する適切な方法はありません。equals()Object

于 2013-03-04T13:10:00.187 に答える