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検索すると、設定と取得でこの辺の関係が逆になるような事が書いてあったのですが 理解できませんでした。
何とか、理解を助けてもらえないでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/28 21:52:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:techmedia-think No.1

回答回数46ベストアンサー獲得回数13

ポイント100pt

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

id:office55

そうすると、extendsは 何の為にあるんでしょうか??

2012/08/27 06:45:56
id:techmedia-think

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

2012/08/27 13:59:13
id:Sampo No.2

回答回数556ベストアンサー獲得回数104

ポイント100pt

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

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

id:newta No.3

回答回数68ベストアンサー獲得回数7

ポイント100pt

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

  • id:office55
    図にして、代入・取得ができるかよく考えてみたら 制限がかかるのが理解できました。ありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません