理解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。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 8,824评论 1 24
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • 作者: 一字马胡 转载标志 【2017-11-03】 更新日志 1、上界通配符 首先,需要知道的是,Java语言...
    一字马胡阅读 4,996评论 0 12
  • 文/余生 亲爱的EM,见字如面: 去月一别,久疏问候,也不知你胖了瘦了,头发长了短了。 前段日子,在一个西餐厅见证...
    余生终老i阅读 2,833评论 0 0
  • 如果还有机会可以重来,我只想再多说一句:“未来,不再见!” 后来,说多了再见,却真成了再见,那些一起走过的青涩时光...
    寻梦陌辰阅读 3,486评论 1 3