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検索すると、設定と取得でこの辺の関係が逆になるような事が書いてあったのですが 理解できませんでした。
何とか、理解を助けてもらえないでしょうか?
Vector<? extends Number>という総称型を定義したば場合、Vector<? extends Number>という型の安全性が守られる必要があるため、Numberを継承した全てのVectorに追加できるもののみ、add可能になります。
つまり、Vector<Integer>にも、Vector<Long>、Vector<Short>...にもaddできるものしかaddできない=nullしかaddできないということになります。
これは共変性・反変性というジェネリック特有の問題になります。
共変性・反変性でぐぐるとC#の解説ばっかり出てくるのですが、
http://ufcpp.net/study/csharp/sp4_variance.html
これとか読んでみてください。C#用語も出てきますがなんとか理解できるんじゃないでしょうか。Javaと共通するこの問題をC#は最近になって解決しています。
extendsはなんのためにある、という問いかけですが、値の取り出しだけをする目的で使うなら問題ありません。Javaは共変・反変のうち共変だけサポートしているのです。
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
そうすると、extendsは 何の為にあるんでしょうか??
2012/08/27 06:45:56add場合は使えませんが、getの場合には有効ですね。↓の記事など参考になるかと思います。
2012/08/27 13:59:13http://www.ibm.com/developerworks/jp/java/library/j-jtp07018.html