QA@IT

Javaのジェネリクスの

3699 PV

ジェネリクスの extends と super の代入互換性?についてイマイチ理解出来ません。
現在の思考は下記の通りです。

List<? extends Integer> list = new ArrayList<Integer>();
//↑ もし add 出来たら、Integer のサブクラスが全て add 出来る事になるので互換性が破壊されるので add 禁止。
//ただし、入ってる要素は Integer かそのサブクラスのはずなので Integer 型として get は OK。

List<? super Integer> list = new ArrayList<Integer>();
//↑ add は出来るけど、Integer とそのスーパークラス両方で参照出来ないとダメなので、Integer かそのサブクラスだけ add 出来る。
//↑ get も一応出来るけど、Object 型でしか get 出来ない。

これだと、"値の追加だけ出来るリスト"・"値の取出だけ出来るリスト"は出来ますが、
追加だけ出来るリストは取出が不可能ですし、取出だけ出来るリストは追加出来ない(中身は常に空?)なのでは?
と考えてしまい、どうやって使えばいいのかイメージが沸かずに思考停止してしまいました。

上記の例だと、
List<? super Integer> list = new ArrayList<Integer>();
list.add(); //追加出来る super で追加
List<? extends Integer> list2 = list;
list2.get(); //取出出来る extends で取出

みたいなイメージしか沸かないのですが、本来の使い方はどうなのでしょうか?

ウォッチ

この質問への回答やコメントをメールでお知らせします。