13

で分かります

Comparator < ? super T> comp

指定されたコンパレータによって定義された順序に従って、指定されたコレクションの最大要素を返します。しかし、私はその目的を理解していません

スーパーT

誰でも説明できますか?

4

3 に答える 3

20

この用語? super Tは、「T である、または T のスーパークラスである未知の型」を意味し、ジェネリック用語では、その下限が T であることを意味します。

この署名が使用されるのは、T が T である、または T のスーパー クラスである任意の変数に割り当てられ、比較される可能性があるためです。つまり、Comparator がその compare() メソッドで T のスーパー クラスを受け入れることができる場合、 T を渡します。

これは、PECS ニーモニック: "Producer Extends, Consumer Super" に従います。つまり、モノのプロデューサーは上限( ? extends T) を持つモノを処理し、コンシューマ (モノを使用するコンパレータの実装など) は下限 (モノを使用するコンパレータ実装など) を処理する必要があることを意味します。 ?スーパーT)。

于 2012-12-09T09:39:59.630 に答える
6

ここではジェネリック< ? super T>を意味します- 比較ではありません。

これは、このスレッドで説明されているようComparatorに、ジェネリック型のがあることを意味します? super T(拡張するものは によってスーパー タイプ化されます)。T

comp変数名 (バインディング) です。

したがって、基本的にここComparator < ? super T>にはタイプがありcomp識別子(変数名)です。つまり、タイプですComparator <? super T>


詳細情報: Java ジェネリック

于 2012-12-09T09:39:01.617 に答える
-1

例として、TreeSet のコンストラクターの 1 つの型を使用してみましょう。

TreeSet(Comparator<? super E> comparator)

Eこれが String であると想像してください。したがって、コンストラクターを精神的に特殊化します。

TreeSet(Comparator<? super String> comparator)

TreeSet次のようにインスタンス化できます。

var mySet = new TreeSet<String>(myStringComparator);

ほら、myStringComparatorこんな感じかも。

Comparator<String> myStringComparator = new Comparator<>() {
    @Override
    public int compare(String o1, String o2) {
        return 0;
    }
};

<? super String>部分により、コンストラクターに文字列のスーパータイプをTreeSet(Comparator<? super String> comparator)比較するコンパレーターを提供することもできます。これは、より一般的で、具体性が低いコンパレーターと言えます。

たとえば、CharSequenceは String のスーパー タイプであるため、これも機能します。

Comparator<CharSequence> myCharSeqComparator = new Comparator<>() {
    @Override
    public int compare(CharSequence o1, CharSequence o2) {
        return 0;
    }
};

var mySet2 = new TreeSet<String>(myCharSeqComparator);

仮説として、TreeSetのコンストラクターが次のように定義されている場合:

TreeSet(Comparator<E> comparator)

この例では、

TreeSet(Comparator<String> comparator)

またはは提供できませComparator<String>んでした。Comparator<CharSequence>Comparator<Object>

比較するために String の詳細を必要としない、より一般的なコンパレータを使用したい場合があるため、これは残念です。

于 2020-11-09T13:50:44.227 に答える