例:
void process(Consumer<Number> consumer);
上のコードは下のコードに置換すべきです。
void process(Consumer<? super Number> consumer);
このメソッドシグネチャーは Consumer<Number> と Consumer<Object> の両方の型を受け付けるため、より柔軟性が高くなっています。
同様に、型パラメーターが共変の位置にある場合を考えます。
T produce(Producer<T> p);
上のコードは下のコードに置換すべきです。
T produce(Producer<? extends T> p);
Effective Java 第 3 版から Joshua Bloch 氏の言葉を引用します。
項目 31: API の柔軟性向上のために境界ワイルドカードを使う
トリッキーではありますが、API で境界ワイルドカードを使うと、API の柔軟性が飛躍的に高まります。 広範に使用されるライブラリを書く場合、ワイルドカード型の適切な使用を考慮することは避けて通れません。 プロデューサー-extends、コンシューマー-super (PECS) の基本ルールを覚えておいてください。 また、すべての Comparable と Comparator がコンシューマーであることも覚えておいてください。
報告対象を切り替えるには、インスペクションのオプションを使用します。
非変クラス。 たとえば、非変クラスには java.util.List<T> があります。このクラスは値を受け付ける (List.add(T) メソッド経由) だけでなく、値を生成 (T List.get() メソッド経由) するためです。
いっぽう、反変クラスは値を受け付けるだけです。たとえば、accept(T) メソッドのみを持つ java.util.function.Consumer<T> があります。 同様に、共変クラスは値の生成のみを行います。たとえば、T get() メソッドのみを持つ java.util.function.Supplier<T> があります。
境界ワイルドカードは共変/反変クラスでよく使用されていますが、void process(List<? extends T> l) のような非変クラスではワイルドカードの使用は避けられています。
このような非変クラスを無視し、void process(List<T> l) のように厳密な型付けを維持するには、このオプションを無効にしてください。
公開 API の一部とは見なされない、private メソッド。
インスタンスメソッド