当前位置:网站首页>List<? extends T>和List<?super T>区别
List<? extends T>和List<?super T>区别
2022-06-23 22:15:00 【Temp_1998_H】
1、先来简单介绍一下二者
1.1、List<? extends T>
这里T是泛型,而?是通配符,"? extends T"表示T是父类,?是子类,该list只能容纳T类型及T类型的子类。
"? extends T"可以用下图表示

因为界限在"?"的上面,因此将extends称之为上界,即extends给?限定了一个上界。
1.2、List<? super T>
"? super T"表示T是子类,?是父类,该list只能容纳T类型及T类型的父类。
"? super T"可以用下图表示

因为界限在"?"的下面,因此将super称之为下界,即super给?限定了一个下界。
2、实际使用
下面主要来看看List<? extends T>和List<?super T>在实际使用中的例子。
下图是我设计的类继承关系图。

其代码如下:
//物体
class WuTi{}
//生物
class ShengWu extends WuTi{}
//动物
class Animal extends ShengWu{}
//猫
class Cat extends Animal{}
//狗
class Dog extends Animal{}
2.1、先来说说List<? extends T>
假设现在有如下两个集合,lista限定了边界,而listb没有限定边界
List<? extends Animal> lista = new ArrayList<>();
List<Animal> listb = new ArrayList<>();
显然,listb是我们最常见的用法。
listb由于泛型的类型是确定的(即Animal类型),所以listb能添加Animal、Cat、Dog(因为猫和狗都是动物)。
但是lista的泛型的类型是不确定的(即用通配符?表示的),所以lista无法添加元素,即使添加Object也不行,只能添加null。
lista由于容纳的是Animal及其子类,所以lista能获取元素,并且获取到的元素的类型是Animal类型准没错。
那么既然lista不能添加元素,又何来的获取元素呢?可以用以下代码实现。
//虽然List<?extends Animal>不能添加元素,但是可以借助List<Animal>初始化元素
List<Animal> data = newArrayList<>();
data.add(new Dog());
data.add(new Cat());
data.add(newAnimal());
List<? extends Animal> listb = data;
//获取元素,其元素类型是Animal
Animal a1 =listb.get(0);
Animal a2 =listb.get(1);
Animal a3 = listb.get(2);
总结:由于只能从List<? extends T>中获取元素,而不能向它添加元素,所以称之为生产者。如下图。

2.2、接下来说说List<? super T>
List<? super Animal> listc = new ArrayList();
此刻我想说的是,listc能够添加元素!
是不是有人就懵了,这跟List<? extends T>不是一样么,都采用通配符?,泛型类型都是不确定的,为什么List<? extends T>不能添加元素,而List<?super T>就能添加元素呢?
我的解答是:listc的泛型类型是不确定的不假,但是List<? super Animal>中的Animal是确定的啊,你想想,假如?表示的是ShengWu类,那么我添加Animal没错吧,因为Animal是生物啊;再假如?表示的是WuTi类,那么我添加Animal也没错,因为Animal是物体啊,哈哈。
另外,既然能添加Animal,那么Animal的子类也能添加,因为猫、狗都是生物或者物体。
所以就有了如下代码
List<? super Animal> listc = new ArrayList();
Animal animal = new Animal();
Dog dog = new Dog();
Cat cat = new Cat();
listc.add(animal);
listc.add(dog);
listc.add(cat);
那么,List<? super T>能获取元素吗?答案是不能,因为无法确定元素的返回值类型到底是啥。
总结:由于只能向List<? super T>添加元素,而不能从它里面获取元素,所以称之为消费者,如下图。

3、最后
最后我扩展一下,PECS(Producer Extends Consumer Super)原则指的就是上述对List<? extends T>和List<? super T>的总结,即生产者对应extends ,而消费者对应super。在实际使用中,我们应当遵循这个原则。
————————————————
版权声明:本文为CSDN博主「初心JAVA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xl_1803/article/details/110800764
边栏推荐
- 这个高仿小米商城项目太惊艳了
- 3D打印和激光切割流程的初步了解
- AutoCAD -- summarize three methods of drawing rounded corners in CAD
- Telecommuting: how to become a master of time management| Community essay solicitation
- Bitmap load memory analysis
- Million message IM system technical points sharing
- E: 无法获得锁 /var/lib/dpkg/lock
- laravel之任务队列
- Cs5213 HDMI to VGA with audio signal output scheme
- [design] 1359- how umi3 implements plug-in architecture
猜你喜欢

Bitmap加载内存分析

2022 Shandong Health Expo, Jinan International Health Industry Expo, China Nutrition and Health Exhibition

STM32-------外部中断

Graph theory (tree diameter)

【Proteus仿真】T6963C驱动PG12864示例(带中英文显示)

开发协同,高效管理 | 社区征文

Stm32-------adc (voltage detection)

Analysis of Alibaba cloud Tianchi competition -- prediction of o2o coupon

AUTOCAD——总结CAD画圆角的三种方式
![[observation] Dell technology + Intel aoteng Technology: leading storage innovation with](/img/cf/3e3eb6389693667edad534b556c15c.png)
[observation] Dell technology + Intel aoteng Technology: leading storage innovation with "nanosecond speed"
随机推荐
ACM. HJ89 24点运算 ●●●
高仿斗鱼 APP
【Try to Hack】masscan
Fabric. JS manual bold text iText
【Xilinx AX7103 MicroBalze学习笔记6】MicroBlaze 自定义 IP 核封装实验
Flutter中的GetX状态管理用起来真的那么香吗?
【Proteus仿真】T6963C驱动PG12864示例(带中英文显示)
STM32-------定时器
Le roman du drapeau de l'imitation haute version flutter, apprenez - le
保障特殊困难群体安全,广州民政全力做好三防工作
What to check for AIX system monthly maintenance (II)
Facebook 开源微光效果 Shimmer
Thinking (86): master-slave realization idea
Postman return value Chinese garbled????
Kotlin coroutine asynchronous flow
"Shanda Diwei Cup" the 12th Shandong ICPC undergraduate program design competition
19 MySQL optimizations commonly used in projects
AIX system monthly maintenance check (I)
抖音支付十万级 TPS 流量发券实践
Bitmap load memory analysis