1

私は Java チュートリアルを進めていて、理解できないことに出くわしました。Collections Trail では、Wrapper の実装について説明していますが、そこで 2 つの静的ファクトリ メソッドに気付きました。

public static <T> Collection<T> synchronizedCollection(Collection<T> c);

public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c);

同期ラッパーが制限付きワイルドカードを使用しないのはなぜですか? つまり、synchronizedCollection の署名が次のようにならないのはなぜですか?

public static <T> Collection<T> synchronizedCollection(Collection<? extends T> c);
4

2 に答える 2

2

Collection<? extends T> cそれでは、ものを取得することはできますが、追加することはできません。これは、の場合に意味がありunmodifiableCollectionます。メソッドの場合、引数はプロデューサーとしてのみ機能する必要があります。ただし、の場合はsynchronizedCollection同期されますが、それでも変更可能であり、追加と削除もできる必要があるため、Collection<T> cプロデューサーとコンシューマーの両方として機能する必要があります。

これは、PECS(Producer Extends Consumer Super)とは何かを知るのに役立つかもしれません。

于 2012-10-03T19:31:55.490 に答える
-1

unmodifiableCollection間違っていると思います。Collection<T>どちらのメソッドもas としてラップするつもりCollection<T>であり、型引数を変更する理由はありません。

確かに、 a を取り込む方がより柔軟であるため、呼び出し元は aを変更不可能なorなどCollection<? extends T>に変換するように要求できます。しかし、誰がそれを必要とするのでしょうか? 読み取り専用は、とにかくよりもあらゆる点で優れています。Collection<Integer>Collection<Integer>Collection<Number>Collection<Object>Collection<Integer>Collection<Number>

入力タイプ自体にワイルドカードが含まれている場合、たとえば

Collection<? extends Number> someNumbers = ...;

私たちunmodifiableCollection(Collection<? extends T>)にできること

          Collection<Number> readonlyNumbers 
                             = unmodifiableCollection(someNumbers);
          Collection<Object> readonlyObjects 
                             = unmodifiableCollection(someNumbers);

しかし、unmodifiableCollection2(Collection<T>)私たちはしなければなりません

Collection<? extends Number> readonlyNumbers 
                             = unmodifiableCollection2(someNumbers);
Collection<? extends Object> readonlyObjects  
                             = unmodifiableCollection2(someNumbers);

2 番目のバージョンはややこしいですが、おそらくより政治的に正しいでしょう。

于 2012-10-03T19:55:46.627 に答える