浅谈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

posted @ 2020-04-17 09:22  Parachute黑喵  阅读(305)  评论(0编辑  收藏  举报