理解JAVA泛型中的PECS原则
PECS描述:
PECS原则的全拼是"Producer Extends Consumer Super"。
当需要频繁取值,而不需要写值则使用" ? extends T “作为数据结构泛型。相反,当需要频繁写值,而不需要取值则使用” ? super T "作为数据结构泛型。
代码验证:
class Fruit{
}
class Apple extends Fruit{
}
class RedApple extends Apple{
}
class Main{
public static void main(String[] args) {
//List extends Apple> apples = new ArrayList(); 编译报错
//List extends Apple> apples = new ArrayList(); 正确
List extends Apple> apples = new ArrayList(); //正确
apples.add(null); //正确
apples.add(new Fruit()); //编译报错
apples.add(new Apple()); //编译报错
apples.add(new RedApple()); //编译报错
//Fruit apple = apples.get(0); //正确
Apple apple = apples.get(0); //正确
//List extends Apple> apples2 = new ArrayList(); 编译报错
//List extends Apple> apples2 = new ArrayList(); 正确
List super Apple> apples2 = new ArrayList(); //正确
apples2.add(new RedApple()); //正确
apples2.add(new Apple()); //正确
//apples2.add(new Fruit()); 编译错误
//Apple apple2 = apples2.get(0); //错误
//Fruit apple2 = apples2.get(0); //错误
Object apple2 = apples2.get(0); //正确
apples2.get(1);
}
}
量化总结:
PE (producer extends) 生产者使用 extends, 上界确定,读取优良(用Apple接收),下界不定,写入不行(只能存null),写入读多写少(生产者读取了才能进行生产)
CS (customer super) 消费使用 super, 上界不定,读取不行(只能用Object接收),下界确定,写入优良(可以写入Apple与Apple的子类型),写多读少(消费者消费了要进行写入)



