凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46600
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

ジェネリクスの代入を理解する その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
コメント
タイトル
名前
Url
コメント