泛型中的extends和super

extends

List<? extends Number> 列表里的元素都是Number或Number的子类型,不能add新元素,但可以被子类列表赋值,取元素时只能取出Number类型元素

List<? extends Number> list1 = new ArrayList<>();
list1.add(1); //会编译错误

List<Integer> list2 = new ArrayList<>();
list2.add(1);
list1 = list2;
Integer i1 = list1.get(0); // 会编译错误
Number number = r.get(0); // 编译正常

super

List<? super Integer> 列表里的元素都是Integer或Integer的父类型,可以add新元素,可以被Integer父类型赋值,但取值时只能取Object类型,需要强转

List<? super Integer> list1 = new ArrayList<>();
list1.add(1); // add正常
Integer i1 = list1.get(0); // 会编译报错
Object object = list1.get(0); // 编译正常
Integer i2 = (Integer) list1.get(0);

PECS: Producer Extends, Consumer Super

最后更新于

这有帮助吗?