当前位置:网站首页>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
边栏推荐
- 企业网站的制作流程是什么?设计和制作一个网站需要多长时间?
- iNFTnews | 创造者经济的未来在Web3世界中该去向何处?
- 完整开源项目之诗词吧 APP
- Why do MySQL indexes use b+ trees at the bottom? After reading this article, you can easily handle the interview.
- Golang 类型断言
- Grpc security -2: fast implementation of server-side JWT authentication
- 6 大完整开源项目,一次学个够
- STM32-------定时器
- 图论(树的直径)
- ORB_ Slam3 environment setup and demo demonstration
猜你喜欢

One person even broke up a Netease cloud music Cloud Village

Bitmap load memory analysis

企业网站的制作流程是什么?设计和制作一个网站需要多长时间?

Some explanations of Tim timer of embedded interface and STM32 template library function of NVIC

Sorry, your USB cable may be wrong!

Common core resource objects of kubernetes

2022山东健博会,济南国际大健康产业博览会,中国营养健康展

MySQL导致索引失效的情况详解

一个人竟然撸了一个网易云音乐云村

高仿書旗小說 Flutter 版,學起來
随机推荐
Some explanations of Tim timer of embedded interface and STM32 template library function of NVIC
有哪些劵商推荐?在线开户安全么?
再见,2020,这碗毒鸡汤,我先干了
Analysis on the advantages and disadvantages of the best 12 project management systems at home and abroad
解决Slf4j日志不打印问题
NLog details
2022 Shandong Health Expo, Jinan International Health Industry Expo, China Nutrition and Health Exhibition
Facebook 开源微光效果 Shimmer
根据先序遍历和中序遍历生成后序遍历
Kotlin coroutine asynchronous flow
保障特殊困难群体安全,广州民政全力做好三防工作
Zynq ultrascale+ RF data converter IP configuration - ADC
3D打印和激光切割流程的初步了解
BroadcastReciver 和LocalBroadcastManager区别
Le roman du drapeau de l'imitation haute version flutter, apprenez - le
【HackTheBox】Fawn
Task queue of laravel
Is Everbright futures safe? What do I need to open an account?
STM32-------定时器
The fortress machine installs pytorch, mmcv, and mmclassification, and trains its own data sets