当前位置:首页 > 每日看点 > 正文内容

被ja中

卡卷网7个月前 (01-10)每日看点122

Ja泛型边界:为啥要用extends和super?

开胃菜:为啥要有边界?

先来看个场景:

//假设我们在写一个动物园 List<Dog>dogs=newArrayList<>(); List<Animal>animals=dogs;//❌编译报错! //但我们明明知道狗是动物啊为啥不能这样写

这就是今天要解决的问题!

上界<?extendsT>:只能取不能存

1.extends的核心特点:

List<?extendsAnimal>animals=newArrayList<Dog>();//可以 List<?extendsAnimal>animals=newArrayList<Cat>();//也可以r/> //但是! animals.add(newDog());//❌编译报错 animals.add(newCat());//❌编译报错 animals.add(newAnimal());//❌还是报错 Animalanimal=animals.get(0);//读取没问题

2.为什么不能add?

想象你有一个装动物的盒子:

List<?extendsAnimal>ox=newArrayList<Dog>(); //编译器:"这个盒子可能是装狗的,也可能是装猫的" //"我不能让你往里面放任何东物,因为不知道具体是啥"

3.什么时候用extends?

//当你只需要读取数据时 pulicvoidprintAnimals(List<?extendsAnimal>animals){ for(Animala:animals){//安全,因为知道都是Animal System.out.println(a.getName()); } }

下界<?superT>:只能存不能取(完全取)

1.super的核心特点:

List<?superDog>dogs=newArrayList<Animal>();//可以 List<?superDog>dogs=newArrayList<Oject>();//也可以 dogs.add(newDog());//✅可以添加Dog dogs.add(newHusky());//✅可以添加Dog的子类 Dogdog=dogs.get(0);//❌编译报错 Ojectoj=dogs.get(0);//只能以Oject接收

2.为什么不能完全get?

List<?superDog>ox=newArrayList<Animal>(); //编译器:"这个盒子可能是装Animal的,也可能是装Oject的" //"我只能保证取出的东西是个Oject"

3.什么时候用super?

//当你需要写入数据时 pulicvoidaddDogs(List<?superDog>dogs){ dogs.add(newDog());//安全,因为容器至少能装Dog dogs.add(newHusky());//Husky是Dog的子类,也没问题 }

经验法则:PE原则

ProducerExtends,ConsumerSuper

1.生产者用extends

//当你需要从中读取数据时 pulicvoidreadAnimals(List<?extendsAnimal>animals){ //这里的是数据的生产者 animals.forEach(Animal::makeSound); }

2.消费者用super

//当你需要往中写入数据时 pulicvoidaddDogs(List<?superDog>dogs){ //这里的是数据的消费者 dogs.add(newDog()); }

-如果只读取,用extends-如果只写入,用super-如果既要读又要写,别用通配符!

//不要这样 pulicvoidconfusingMethod(List<?>list){...} //要这样 pulic<T>voidclearMethod(List<T>list){...}


<>最后做个总结

泛型边界就像动物园的笼子,extends是"此笼最大能装xx",super是"此笼最小能装xx"

extends不能存能取(Animal)用于生产者场景super能存(Dog及子类)不能完全取(只能取Oject)用于消费者场景

如果觉得有帮助请点个赞!

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2025/01/8453.html

分享给朋友:

相关文章

200+ 工具,这个网站堪称最强

200+ 工具,这个网站堪称最强

作为一个乱七八糟什么都懂一点的电脑小白,日常经常被别人增加些临时任务,比如PDF转Word,提取视频里的音频,图片加个边框。之前,电脑里安装了不少这类的软件,虽然能满足要求,但装的多了,总感觉电脑卡卡的。最近发现了一个超强的在线工具网站,首...

为什么程序员不自己开发微信小程序这类似的东西赚钱?

为什么程序员不自己开发微信小程序这类似的东西赚钱?

你如果有好的想法是可以挣钱的首先大家说的个人资质限制确实多,也不建议直接拿个人资质去用小程序盈利,因为很麻烦我说一下我的大体操作:1.首先去申请个体户,这个可以用住宅来注册申请,而且速度很快就几天就下来了,经营类目主要是互联网销售这些,不过...

网易云音乐里有哪些打动你的评论?

1.“如果我被强奸了,有人说我会失去贞操。”“我怎么失去贞操了呢?” “我的贞操不在我的阴道里。”“失去贞操的是强奸犯,而不是被强奸的人。”2.但要记得那年海边的烟火,我们不拘一格 ,嘲笑过生活。………网易云热评《这样就很好》3.“ 我们在...

为什么我们一直在给B站充大会员但B站却一直处于亏损状态?

我讲一下离谱的真相吧,欢迎喷我。很多人都觉得B站在赶走人才,赶走优秀的长视频创作者,也觉得知乎在这么做,是没错的。确实在这么做。而原因很简单。只有影响力很大的KOL才有商业价值。(KOL是指“关键意见领袖”)而你说你是人才?对不起,人才不赚...

Redmi 为什么可以把性价比做得那么高?

一位修手机的老大哥曾经跟我说过,红米1那个手机,除了处理器还凑活,其余零部件,就是市面上山寨机那种。其实红米性价比并不算极致,而且一直都有竞争者,从原来的群魔乱舞,到后来的荣耀,魅蓝,一加,再到现在的IQOO和realme。红米的方法也很简...

如何判断 Java 工程师的基础知识是否扎实?

我来给你出几道大题,能答对70%,你就算基础扎实了。第一部分 Java基础(27)1. 程序本质:代码是如何被执行的?CPU、操作系统、虚拟机各司何职?2. 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法3. 引用类型:同...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。