ジェネリクスの罠。

どえらい勘違いをしていた。

class A{}
class B extends A{}
List<A> list = new ArrayList<A>();
list.add(new B());

ができないと思っていた。

ワイルドカード使おうとしても

class A{}
class B extends A{}
List<? extends A> list = new ArrayList<? extends A>();
list.add(new B());

だとコンパイルエラーになるし、どうしたものかとかなり長いこと悩んでたのに(笑)

List<A> list = new ArrayList<A>(); // <= OK
List<A> list = new ArrayList<B>(); // <= NG
List<? extends A> list = new ArrayList<B>(); // <= OK

List<A> list = new ArrayList<A>();
list.add(new B()); // <= OK

てなことなんだね。