class Food {}
class Fruit extends Food {}
class Apple extends Fruit {}
class Banana extends Fruit{}
public class Main {
public static void main(String[] args) {
List<? extends Fruit> list2 = new ArrayList<Banana>();
// list2.add(new Apple()); // list2真正修饰的元素不知道。
Fruit fruit = list2.get(0);
// list1声明元素是Fruit及父类的list,
List<? super Fruit> list1 = new ArrayList<Food>();
list1.add(new Apple());
list1.add(new Banana());
// 迭代不方便,因为不清楚具体哪个父类
// Fruit object = list1.get(0);
}
}
从代码中可以看到
1、List<? super Fruit> list1只是在声明时,修饰的是super超类的list,其实是可以往里面加各种子类的;而获取就时,不能保证是Fruit类对象,也就会报错。
2、List<? extends Fruit> list2只在声明时,修饰的是extends子类的list。因为不知道具体是哪个类,所以不适合添加元素;适合获取元素。
最后说一下,很多老外博客都会说PECS规则,即生产者用extend,消费者用super,既是生产者也是消费者必须指定类型。这个我觉得这个是结论。
部分参考:https://blog.csdn.net/qq_33561055/article/details/87289812
网友评论