下届通配符ArrayList<? super Fruit> 列表中可以添加Fruit父类的实例吗?

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()); //报错

为什么报错?

我产生这个问题的原因是这个:

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); //我觉得这个应该也不可以,但是实际上可以
}

这两者有什么区别?

阅读 2.1k
3 个回答

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

不能是父类。举个极端的例子,所有的类都继承自Object,如果父类可以那不就所有的类都可以了吗?

不能,给ArrayList<? super Fruit>赋值的时候,并不确定会将那些东西赋值给它,但能确定的是赋值进去的元素最低是Fruit,那么我们向其中添加Fruit和其子类是一定没有错的。
顺带一提,ArrayList<? entends Fruit>表示,最高是Fruit,但是最低是多少是没有限度的,所以你不能往其中添加元素,只能给整个赋值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题