人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Javaの総称型がよくわかりません。教えてください。以下のコードがコンパイルエラーになります。

Vector<? extends Number> v = new Vector<Integer>();
Integer value = new Integer(3);
v.add(value);

最後の3行目のaddで、
「型 Vector<capture#1-of ? extends Number> のメソッド add(capture#1-of ? extends Number) は引数 (Integer) に適用できません」
というエラーになります。

「extends Numberとしているので vは Numberを継承したものであれば入れられる」と自分は解釈しているのですが、違うようです。
Google検索すると、設定と取得でこの辺の関係が逆になるような事が書いてあったのですが 理解できませんでした。
何とか、理解を助けてもらえないでしょうか?

●質問者: office55
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● techmedia-think
●100ポイント

Vector<? extends Number>という総称型を定義したば場合、Vector<? extends Number>という型の安全性が守られる必要があるため、Numberを継承した全てのVectorに追加できるもののみ、add可能になります。
つまり、Vector<Integer>にも、Vector<Long>、Vector<Short>...にもaddできるものしかaddできない=nullしかaddできないということになります。


office55さんのコメント
そうすると、extendsは 何の為にあるんでしょうか??

techmedia-thinkさんのコメント
add場合は使えませんが、getの場合には有効ですね。↓の記事など参考になるかと思います。 http://www.ibm.com/developerworks/jp/java/library/j-jtp07018.html

2 ● Sampo
●100ポイント

これは共変性・反変性というジェネリック特有の問題になります。
共変性・反変性でぐぐるとC#の解説ばっかり出てくるのですが、
http://ufcpp.net/study/csharp/sp4_variance.html
これとか読んでみてください。C#用語も出てきますがなんとか理解できるんじゃないでしょうか。Javaと共通するこの問題をC#は最近になって解決しています。

extendsはなんのためにある、という問いかけですが、値の取り出しだけをする目的で使うなら問題ありません。Javaは共変・反変のうち共変だけサポートしているのです。


3 ● newta
●100ポイント

IntegerをNumberジェネリクスつきにaddしたいのであればならば出来ます。
superにするとまたNumberからIntegerを利用したいときキャストしないといけないので
あまり便利ではないですが。

この辺は難しいですよね。ここの方が図付きで書いてくれていて、
ちょっとだけ分かりやすくなっています。
個人的にはそれでも結構真面目に考えると難しいです。
http://blogs.wankuma.com/nagise/archive/2008/08/18/153424.aspx
http://blogs.wankuma.com/nagise/archive/2008/08/20/153557.aspx

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ