ジェネリクスの代入を理解する その2に以下の質問を頂きました。
インタフェースIFをAが実装しているとし、
A←B←Cの関係はそのままの場合で下記処理をコンパイルしたとします。
List<? super B> list = new ArrayList<IF>
list.add(new B()); //1
list.add(new A()); //2
list.add(new C()); //3
この場合も2はエラーとなってしまいます。
ArrayList<IF>にAをaddしても矛盾しないと思うのですが、
これは何故なのでしょうか??
変数list はList<? super B>型ですから、ArrayList<B>型を代入することができますよね。
List<? super B> list = new ArrayList<IF>();
list = new ArrayList<B>();
list.add(new A());
としたらどうなるでしょうか?
ArrayList<B>にAをaddすることになりますね。落ち着いて考えてみてください。List<? super B> list = new ArrayList<A>();のケースと同じです。
コンパイルによる静的な型チェックは、いつ変数listにどういう型を代入されたかを追跡しません。
なので代入して矛盾が発生する可能性がある場合にすべてコンパイルエラーとします。
古いエントリになりますが、ジェネリクスと代入と落とし穴2も併せてご覧ください。
投稿日時 : 2009年1月4日 18:06