鍍金池/ 問答/Java/ 下屆通配符ArrayList<? super Fruit> 列表中可

下屆通配符ArrayList<? super Fruit> 列表中可以添加Fruit父類的實(shí)例嗎?

public class Food {
}

public class Fruit extends Food {
}

public class Apple extends Fruit {
}

ArrayList<? super Fruit> arrayList = new ArrayList<>();

arrayList.add(new Apple()); //正常
arrayList.add(new Fruit()); //正常
        
arrayList.add(new Food()); //報錯

為什么報錯?

我產(chǎn)生這個問題的原因是這個:

static void set(Pair<? super Integer> p,Integer first,Integer last){
        p.setFirst(first);
        p.setLast(last);
}

public static void main(String[] args) {
        PairHelp.set(new Pair<Integer>(1,2),1,2);
        PairHelp.set(new Pair<Number>(1,2),1,2); //我覺得這個應(yīng)該也不可以,但是實(shí)際上可以
}

這兩者有什么區(qū)別?

回答
編輯回答
初心

? super Fruit:可以是Fruit或者是Fruit的父類,但是父類并無法確定是什么類型,但可以確定Fruit的子類肯定是Fruit類型,所以只能add Fruit和它的子類

2018年2月12日 11:13
編輯回答
蟲児飛

不能是父類。舉個極端的例子,所有的類都繼承自O(shè)bject,如果父類可以那不就所有的類都可以了嗎?

2017年6月14日 08:21
編輯回答
真難過

不能,給ArrayList<? super Fruit>賦值的時候,并不確定會將那些東西賦值給它,但能確定的是賦值進(jìn)去的元素最低是Fruit,那么我們向其中添加Fruit和其子類是一定沒有錯的。
順帶一提,ArrayList<? entends Fruit>表示,最高是Fruit,但是最低是多少是沒有限度的,所以你不能往其中添加元素,只能給整個賦值

2017年12月20日 14:13