PECS
关于泛型有个PECS(Producer Extends Consumer Super)规则,说的是
List<? extends Person> list = new ArrayList();
//编译错误,不允许往里添加元素,
list.add(new Person());
//编译通过
Person person = list.get(0);
List<? super Person> list2 = new ArrayList<>();
//编译通过
list2.add(new Person());
//只能赋值给Object类型,无法确定具体类型
Object o = list2.get(0);
Producer Extends
这是因为? extends Person表示Person的某一个子类,可能是Man也可能是Woman、甚至就是Person,如果往List<Man>添加Person肯定是不行的,类型不安全。但取出来的元素可以赋值给Person
Person p = list.get(0);
往外取是producer,所以Producer Extends,简称PE
Consumer Super
? super Person,正好相反,表示Person及Person的父类,所以可以往里添加 Person及其子类,因为Person及其子类肯定是? super Person的子类,所以添加的元素类型是可以确保安全的。
而取时,因为无法确保类型,所以只能赋值给Object类型。添加是Consumer操作,所以是Consumer Super,简称CS;
这两种情况合起来就是PECS(Producer Extends Consumer Super)
本文详细解释了Java泛型中的PECS原则,即Producer Extends Consumer Super。通过示例展示了? extends T用于读取操作(Producer),保证安全取出;而? super T适用于写入操作(Consumer),确保添加元素时的类型安全。理解这一原则对于编写类型安全的Java代码至关重要。
523

被折叠的 条评论
为什么被折叠?



