zoukankan      html  css  js  c++  java
  • 浅谈java通配符 ? extends 和 ? super

    <? extends T><? super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。

    <? extends T>  

    属于上界通配符,T一般都是父类泛型,这就意味着比如我举个例子:

    ArrayList heroList<? extends Hero>

    Hero是父类泛型,意味着这个heroList里面可以存Hero的子类比如APHero之类的,相当于你定义了一个”水果盘子“,上面可以存具体的水果比如苹果。

    但是需要注意的是这个盘子在定义后不允许add:

    heroList.add(new ADHero());  //这个会报错

    原因是ADhero虽然是Hero的子类,但是另一个子类APhero就不属于ADhero,所以不能放。

    那么其意义是什么呢?这个通配符的意义在于我们可以用“APHero”给“Hero”赋值了,虽然不能往里面加东西,但是可以取出来,并且取出来的一定是可以转换成Hero的。

    <? super T>

    下界通配符,可以放Hero泛型或者其父类泛型。

            ArrayList<? super Hero> heroList = new ArrayList<Object>();//heroList 的泛型可以是Hero
            //heroList 的泛型可以是Object
              
            //所以就可以插入Hero
            heroList.add(new Hero());
            //也可以插入Hero的子类
            heroList.add(new APHero());
            heroList.add(new ADHero());
              
            //但是,不能从里面取数据出来,因为其泛型可能是Object,而Object是强转Hero会失败
            Hero h= heroList.get(0);
     

    PECS原则:

    最后看一下什么是PECS(Producer Extends Consumer Super)原则,已经很好理解了:

    1.频繁往外读取内容的,适合用上界Extends。

    2.经常往里插入的,适合用下界Super。

    引用:https://www.zhihu.com/question/20400700

  • 相关阅读:
    BootstrapTable表格数据左右移动功能遇到的问题(数据左右移动,列表拖拽排序,模糊查询列表数据定位)
    MVC校验
    线程
    验证码
    PublicLogic
    进程
    请求处理过程
    上传组件
    委托
    Global全局应用程序类
  • 原文地址:https://www.cnblogs.com/cptCarlvon/p/12717604.html
Copyright © 2011-2022 走看看