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

  • 相关阅读:
    codevs 3641 上帝选人
    codevs 1966 乘法游戏
    codevs 1345 饥饿的奶牛
    codevs 1962 马棚问题--序列型DP
    codevs 1959 拔河比赛--判断背包内刚好装满n/2个物品
    codevs 1297 硬币
    [转载]矩阵取数游戏
    101.金明的预算方案(分组背包)
    105.(并查集结合绝对值最小的01背包)选学霸
    POJ 2528 Mayor's posters(线段树)
  • 原文地址:https://www.cnblogs.com/cptCarlvon/p/12717604.html
Copyright © 2011-2022 走看看