? 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
Effective Java Reloaded: This Time It's Not for Real
- Use when parameterized instance is a T producer ("for read/input")
- Use when parameterized instance is a T Consumer ("for write/output")