? super E

今日、? super Eって使わないよねー、って話が出たので、使う例を紹介しときますね。


例えばこんなメソッド。

public static <E> void copy(List<E> src, List<? super E> dst) {
    for (E e : src) {
        dst.add(e);
    }
}

ここで、dstの型をListとしてしまうと、こんなコードは書けないことになる。

interface SomeInterface {}
class SomeClass implements SomeInterface {}
List<SomeClass> lst1 = Arrays.asList(new SomeClass());
List<SomeInterface> lst2 = new ArrayList<SomeInterface>();
copy(lst1, lst2);


ちなみに、Collections.copyのシグニチャはこうなってる。

public static <T> void copy(List<? super T> dest, List<? extends T> src)

順番が気持ち悪い・・・


あと、superやらextendsやら訳分からん、って人は、Effective Java Reloaded: This Time It's Not for Realを読むといいと思うよ。

Basic Rule for Bounded Wildcards

  • Use when parameterized instance is a T producer ("for read/input")
  • Use when parameterized instance is a T Consumer ("for write/output")
Effective Java Reloaded: This Time It's Not for Real