2

最近、私は次のような関数宣言を見ました:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    //....
}

<T extends Comparable<? super T>>コードスニペットのTに設定されている制限を教えてもらえますか。どうもありがとう!!!!

4

2 に答える 2

2

刺します。単純なものから始めます。

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を実装するスーパークラスがある場合は、それでも問題ありません。

于 2013-03-10T05:12:19.703 に答える
1

これを左から右にステップスルーして、それが何を意味するのかを理解することができます。

で始まります。T extends Comparableこれは、使用されている汎用インターフェースがを拡張する必要があることを意味しますComparableTは拡張されているためComparable、インターフェイスである必要があることに注意してください。

次に、これは、 (パーツ)Comparable<? super T>>によって使用されるタイプがのスーパークラスでなければならないことを意味します。Comparable<>T

すべてをまとめると、次のようなステートメントが得られます。

Tよりも高いタイプのComparableを拡張するジェネリックインターフェイスT。

ここで、「より高い」とはスーパークラスを意味します。

ジェネリックに関するほとんどの制限は、いくつかのコーナーケースを除いて、このように解釈できます。再び行き詰まった場合は、左から右に大声で読み上げ、口頭で分解して、何が起こっているのかを正確に確認してください。

于 2013-03-10T05:11:54.347 に答える