上記のコードでメソッドをオーバーライドしているのではなく、メソッドをオーバーロードしていることに注意してください。compareTo
あなたinterface
が実装している:
public interface Comparable<T> {
public int compareTo(T o);
}
あなたの実装:
@Override
public int compareTo(Object t) {
//...
}
このインターフェースの最初の作成者である Josh Bloch は、彼の著書『Effective Java@Override
』の中で、まさにこの理由でアノテーションを使用するようアドバイスしています。過負荷によって引き起こされるバグは、見つけるのがかなり難しい場合があります。
これらのオブジェクトを「複数のフィールドに基づいて」比較したいとおっしゃいましたが、これが「2 つのフィールドに基づいて 1 つの方法で並べ替える」ことを意味するのか、それとも「1 つのフィールドに基づいて複数の方法で並べ替える」ことを意味するのかはわかりません。ここの他の回答で示されているように、どちらも可能です。
ただし、これが結論です。
Comparable<T>
自分でクラスを作成しているように見え、このクラスの「自然な順序付け」を定義したい場合は、実装する必要があります。複数の順序付けを定義したい場合、または問題のクラスを制御できない場合は、実装するクラスで独自の順序付けを定義してくださいComparator<T>
(こちらを参照)。