理解java泛型通配符
<? extends T>:是指 上界通配符(Upper Bounds Wildcards)表示为T的所有子类
<? super T>:是指下界通配符(Lower Bounds Wildcards)表示为T的所有父类
class Person {}
class Boy extends Person {}
class Girl extends Person {}
class LittleBoy extends Boy {}
class LittleGirl extends Girl {}
List<? extends Person> list = new ArrayList<Boy>();
List<? extends Person> list = new ArrayList<Girl>();
可以装载Person的子类Boy、Girl,但
list.add(new Boy()); it not works;但这样却不行。。。是否推翻了上面的结论呢
List<? extends Person> list = new ArrayList();
list.add(new Boy()); it not work;
list.add(new Girl()); it not work;
因为Person的子类类型是不确定的,如果这样能装载会使泛型失去意义。
但能使用:
Person person = list.get();因为所有的类型都是Person的子类,java多态形式。
而<? super T> 下界通配符
List<? super Boy> list = new ArrayList<Person>();
list.get(); it not work; 因为父类型是不确定的。
但能:list.add(new LittleBoy());因为他始终是插入Boy和Boy的子类是确定的。
开发时遵守PECS原则
PECS(Producer Extends Consumer Super)原则,已经很好理解了:
频繁往外读取内容的,适合用上界Extends。
经常往里插入的,适合用下界Super。