Java中extends和super

2019-11-27  本文已影响0人  lanmoyingsheng
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

上一篇下一篇

猜你喜欢

热点阅读