26

コレクションのget と put の原則を理解しています。メソッドが型 T を書き込むコレクションを受け取る場合、パラメーターは でCollection<? super T>ある必要がありますが、型 T を読み取る場合、パラメーターは である必要がありますCollection<? extends T>

Collections.max()しかし、誰かが署名を説明してもらえますか:

public static <T> T max(Collection<? extends T> coll,
                    Comparator<? super T> comp)

特に、なぜComparator<? super T>代わりにComparator<? extends T>?

4

3 に答える 3

66

ここではJosh Bloch のニーモニックPECSが役に立ちます。次の略です。

生産者extends、消費者super

これは、メソッドに渡されるパラメーター化された型が のインスタンスを生成するT場合(それらは何らかの方法で取得される)、? extends Tを使用する必要があることを意味します。これは、 のサブクラスのインスタンスTT.

メソッドに渡されるパラメーター化された型が のインスタンスを消費するT(何かを行うために渡される) 場合、? super Tを使用する必要がありTますT。たとえば、 はでComparator<Number>使用できます。はを操作できないため、機能しません。Collection<Integer>? extends TComparator<Integer>Collection<Number>

編集: get/put (生成/消費) についてもう少し明確にするには:

public T something();
       ^

上記は、 を生成するメソッドですT

public void something(T t);
                      ^

上記は を消費するメソッドですT

「プロデューサーextends、コンシューマーsuper」は、パラメーター化されたオブジェクトが渡されるメソッドがそのオブジェクトを使用する方法に適用されます。の場合Collections.max()、アイテムは から取得されるCollectionので、プロデューサーです。これらのアイテムはメソッド on に引数として渡されるComparatorため、コンシューマです。

于 2010-02-11T23:13:14.993 に答える
1

Comparator は T のペアを消費し、int を生成します。Collection は、コンパレータが消費する T を生成します。

スーパーは消費し、生産物を拡張します。

get と put の原則に関連して、get は生成し、put は消費します。

于 2010-02-11T23:09:19.620 に答える
0

Tコンパレーターは引数としてa を取ることができる必要があります。

于 2010-02-11T22:51:11.847 に答える