0

検討

List<? super Integer> lst= new ArrayList<Number>();
lst.add(new Integer(3)); //ok- why?? I expected compile error "expected add(int, Object), found add(int,CAP#1)"
lst.get(0); //ok

List <? extends Number> nums= new ArrayList<Integer>();
lst.add(new Integer(3));//Compile error- expected add(int, Object), found add(int,CAP#1)

コンパイル状態では、型がわから<? extends Number>ず、コンパイル エラーが発生します。<? super Integer>コンパイル状態の型について知っていますか? なんで?

4

1 に答える 1

2

もちろん、ワイルドカードの値が何であれ、それはInteger(定義上、境界から) のスーパークラスであることを知っています。したがって、具体的なクラスが何であれ、保持できるもののリストがありますInteger。このコンテキストでは、 List<Object>orList<Number>は a と同様に機能します。List<Integer>

ただし、 extendの場合別の話です。AList<? extends Number>は である可能性があるList<Double>ため、タイプ セーフに違反することなくこのリストに Integer を挿入できないことは明らかです。null(実際には、この理由を除けば、何も挿入できません。)

于 2013-09-23T16:10:00.863 に答える