凪瀬 Blog
Programming SHOT BAR

目次

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

書庫

日記カテゴリ

 

今回はちょっとしたJavaのクイズをお出ししましょう。

List<String> listA = new ArrayList<String>();
List<Object> listB = listA;

というコードを書いたとき、listB = listAの代入はコンパイルエラーとなります。
さて、なぜでしょう?

それでは、次のようなコードを実行するとどうなるでしょうか?

List<String> listA = new ArrayList<String>();
List<Object> listB = listA;
listB.add(new Object());

listAの参照するオブジェクトとlistBの参照するオブジェクトは同じなのですが…。おやおや?
listBにaddすると、listAも同じものですからArrayListにObjectがaddされることになりますね。
このようなことが起こってしまうのでジェネリクスのパラメータ型が継承関係(今の場合String extends Objectですね) にあっても代入することはできないのです。

しかし、次のような記述にするとコンパイルすることが出来ます。

List<String> listA = new ArrayList<String>();
List<? extends Object> listB = listA;

ところが、

listB.add(new Object());

とするとコンパイルエラーになるのです。 <? extends ~>型のジェネリクスを使うと、値の取得は出来ても値を設定することはできないのです。
こうして型の互換性のないオブジェクトの混入を防いでいるのですね。

投稿日時 : 2007年8月3日 23:34
コメント
  • # re: ジェネリクスと代入と落とし穴
    かつのり
    Posted @ 2007/08/04 0:28
    Eclipseを使うと、引数名にnullってでてきますね。
    あれはウザイんですが、あきらめています。。。
  • # ジェネリクスと代入と落とし穴2
    凪瀬 Blog
    Posted @ 2007/08/04 23:06
    ジェネリクスと代入と落とし穴2
  • # Enumのコンストラクタのローカルなジェネリクス型パラメータの怪
    凪瀬 Blog
    Posted @ 2008/02/25 18:39
    Enumのコンストラクタのローカルなジェネリクス型パラメータの怪
タイトル
名前
Url
コメント