美文网首页
理解java泛型通配符

理解java泛型通配符

作者: Aiden_Wu | 来源:发表于2018-07-01 18:04 被阅读0次

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

    相关文章

      网友评论

          本文标题:理解java泛型通配符

          本文链接:https://www.haomeiwen.com/subject/bwchuftx.html