で分かります
Comparator < ? super T> comp
指定されたコンパレータによって定義された順序に従って、指定されたコレクションの最大要素を返します。しかし、私はその目的を理解していません
スーパーT
誰でも説明できますか?
で分かります
Comparator < ? super T> comp
指定されたコンパレータによって定義された順序に従って、指定されたコレクションの最大要素を返します。しかし、私はその目的を理解していません
スーパーT
誰でも説明できますか?
この用語? super T
は、「T である、または T のスーパークラスである未知の型」を意味し、ジェネリック用語では、その下限が T であることを意味します。
この署名が使用されるのは、T が T である、または T のスーパー クラスである任意の変数に割り当てられ、比較される可能性があるためです。つまり、Comparator がその compare() メソッドで T のスーパー クラスを受け入れることができる場合、 T を渡します。
これは、PECS ニーモニック: "Producer Extends, Consumer Super" に従います。つまり、モノのプロデューサーは上限( ? extends T) を持つモノを処理し、コンシューマ (モノを使用するコンパレータの実装など) は下限 (モノを使用するコンパレータの実装など) を処理する必要があることを意味します。 ?スーパーT)。
ここではジェネリック< ? super T>
を意味します- 比較ではありません。
これは、このスレッドで説明されているようComparator
に、ジェネリック型のがあることを意味します? super T
(拡張するものは によってスーパー タイプ化されます)。T
comp
変数名 (バインディング) です。
したがって、基本的にここComparator < ? super T>
にはタイプがありcomp
、識別子(変数名)です。つまり、タイプですComparator <? super T>
詳細情報: Java ジェネリック
例として、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 の詳細を必要としない、より一般的なコンパレータを使用したい場合があるため、これは残念です。