泛型List<? extends SuperClass>、List<? super SubClass>是什么含义?怎么使用?

一、泛型的分类

1、无限通配符List<?> list

2、上界通配符List<? extends SuperClass>

3、下界通配符List<? super SubClass>

 

二、无限通配符List<?> list

这种就是开发中使用最多的,不详细讲解

 

三、上界通配符List<? extends SuperClass>

以List<? extends String>为例来讲解一下含义:

这是个List,其中的数组指以String为上界的类型,你不可以往这个数组插入String类型,因为你这有可能是个SubString的数组,你只能保证读出来的数据是String类型的,因此只能作为生产者,里面的数据可以被消费

 比如:List<? extends 水果>

你知道这个容器可能是:香蕉List,也可能是苹果List,但肯定是某一种水果的List。你不能放水果进入是因为,假如你放的是水果(香蕉),但实际上是个苹果List,就会在运行期报异常。同样道理你也不能放水果(苹果)进入。这个容器不能放任何类型的东西进去,因为没有下界,你不知道下界,你唯一知道的是从这个容器里拿出来的是水果。这是个产出水果的容器(生产者),里面的元素拿出来就是水果(可以直接当做水果消费掉)。也就是说,这个数组只能被消费,不能生产数据,也就是不能往里面存数据

 

四、下界通配符List<? super SubClass>

下界<? super T>不影响往里存,但往外取只能放在Object对象里。使用下界<? super Fruit>会使从盘子里取东西的get( )方法部分失效,只能存放到Object对象里。set( )方法正常。

Plate<? super Fruit> p=new Plate<Fruit>(new Fruit());

//存入元素正常

p.set(new Fruit());

p.set(new Apple());

//读取出来的东西只能存放在Object类里。

Apple newFruit3=p.get();    //Error

Fruit newFruit1=p.get();    //Error

Object newFruit2=p.get();

 

五、PECS原则

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

① 频繁往外读取内容的,适合用上界Extends。
② 经常往里插入的,适合用下界Super。

 

 

注:本片内容汇总来源于网络各位博主的总结,对他们表示感谢,如果问题还望指正!

posted @ 2020-10-18 19:34  Java精进之路  阅读(488)  评论(0编辑  收藏  举报