1. ホーム
  2. java

[解決済み] collection.sort/比較可能なコードにおけるジェネリック<T extends Comparable<? super T>>の説明?

2022-02-17 10:18:18

質問内容

私は、collection.sort を通して私のクラスの自然な順序付けを提供するために、比較可能なインターフェイスを常に使用しています。

基本的には、personクラスがあれば、comparableインターフェースを実装してもらい、compareToの実装を提供することになります。しかし、javadocsのCollections.sortの定義には、次のような署名がある。

public static <T extends Comparable<? super T>> void sort(List<T> list)

このジェネリックの定義が全く理解できないのですが?単に次のように記述すればよいのではないでしょうか?

<T implements Comparable<T>>

どなたか教えてください。

どのように解決するのですか?

実は、これは、T できる インプリメント Comparable<? super T> だけでなく Comparable<T> .

例えば、以下のような意味です。 Student クラスを実装することができます。 Comparable<Person> ここで Student のサブクラスです。 Person :

public class Person {}

public class Student extends Person implements Comparable<Person> {
    @Override public int compareTo(Person that) {
        // ...
    }
}

この場合、Listの並べ替えは Collections.sort() をベースにしたもののみです。 Person のプロパティを渡すからです。 Student インスタンスを compareTo()Person (もちろん、ダウンキャスティングしない限り)。

しかし、実際には Student クラスが実装する Comparable<Person> . それは Person を実装していることでしょう。 Comparable<Person>Student はその実装を継承しています。しかし、最終的な結果は同じです。 List<Student>Collections.sort() でソートしてもらう。 Person のプロパティを指定します。

との違いは Comparable<T>Comparable<? super T> は、より明白に Collections.sort()のオーバーロード版。 を取る。 Comparator<? super T> :

class ByAgeAscending implements Comparator<Person> {
    @Override public int compare(Person a, Person b) {
        return a.getAge() < b.getAge();
    }
}

List<Student> students = getSomeStudents();
Collections.sort(students, new ByAgeAscending());