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