理解java泛型通配符

2018-07-01  本文已影响0人  Aiden_Wu

<? 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。

上一篇下一篇

猜你喜欢

热点阅读