最近、私は次のような関数宣言を見ました:
public static <T extends Comparable<? super T>> void sort(List<T> list) {
//....
}
<T extends Comparable<? super T>>
コードスニペットのTに設定されている制限を教えてもらえますか。どうもありがとう!!!!
刺します。単純なものから始めます。
static <T> void sort(List<T> list)
タイプTのリストを並べ替えているとします。ただし、Tを並べ替えることができる必要があるため、次のように制限する必要があります。
static <T extends Comparable> void sort(List<T> list)
これは、ComparableのサブクラスであるTのリストを並べ替えていることを示しています。Comparableはインターフェースであるため、これは実際には、Comparableインターフェースを実装するもののリストであることを意味します。しかし、これでは十分ではありません。Fooは、BazがFooとまったく関係がない場合にComparableを実装できます。したがって、最終的に次のようになります。
static <T extends Comparable<? super T>> void sort(List<T> list)
これは、Tのリストをソートしていることを意味します。ここで、Tは、Comparable <を実装する任意のタイプを意味しますか?super T>-TのメソッドまたはTの祖先(スーパークラス)を介して2つのTを比較できます。これは、並べ替えの過程でアイテムを比較する必要があるため、並べ替えに必要です。明示的なコンパレータがない場合、これを行う唯一の方法は、アイテムが自分自身を比較できるようにすることです。コンパレータはT自体にある必要はありません。Comparableを実装するスーパークラスがある場合は、それでも問題ありません。
これを左から右にステップスルーして、それが何を意味するのかを理解することができます。
で始まります。T extends Comparable
これは、使用されている汎用インターフェースがを拡張する必要があることを意味しますComparable
。T
は拡張されているためComparable
、インターフェイスである必要があることに注意してください。
次に、これは、 (パーツ)Comparable<? super T>>
によって使用されるタイプがのスーパークラスでなければならないことを意味します。Comparable
<>
T
すべてをまとめると、次のようなステートメントが得られます。
Tよりも高いタイプのComparableを拡張するジェネリックインターフェイスT。
ここで、「より高い」とはスーパークラスを意味します。
ジェネリックに関するほとんどの制限は、いくつかのコーナーケースを除いて、このように解釈できます。再び行き詰まった場合は、左から右に大声で読み上げ、口頭で分解して、何が起こっているのかを正確に確認してください。