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

被ja中

卡卷网1年前 (2025-01-10)每日看点236

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

分享给朋友:

相关文章

OZON平台什么产品好卖?

ozon选品的核心重点我不说 你们全网也不见说的这么干的教学了你信我就按照我说的思路去走 不信的出去买课去 一时间消化不了的先点赞收藏起来 真不中了下载也行 因为最近总有坏人给我使诈 平台已经下了我八个视频了 还都是实操教学不废话的那种 气...

PS有哪些实用小技巧,小白也能一学就会?

PS有哪些实用小技巧,小白也能一学就会?

不看后悔系列!本篇分享25个PS实用的技巧!不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。另外我的知乎也写了接近200篇PS的技巧,超级合集分享!我目前正在带一个PS/Ai的软件训练营,两个多月搞定两大软件的学习详细的内...

手机的运行内存真的有必要上16GB吗?

全是国产垃圾APP惯出来的。那些对国产软件没意见的人,建议出国看看,花不了多少钱,出门开 Google Map,订宾馆用 Booking,翻译用 Google translate,聊天用 Telegram,社交活动用 Discord,你会惊...

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

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

如何评价小米14pro顶配可以选配卫星通话,小米15全系都无法选配?

如何评价小米14pro顶配可以选配卫星通话,小米15全系都无法选配?

雷总不是说了吗,我可以不用,但你不能没有。市面上OPPO Find X8 Pro和vivo X200 Pro的卫星通信版分别加价300,而荣耀Magic7和Magic7 Pro有卫星通信版且不加价,荣耀更显诚意。我觉得有是更好的,虽然使用卫...

常微分方程的理论对偏微分方程的研究有没有帮助?

常微分方程的理论对偏微分方程的研究有没有帮助?

之前看到过一句话,好像是 Bourgain 说的,大意是做 ode 的做到深处就到了 pde,做 pde 的做到深处就到了 ode,ode 和 pde 最后是相通的。以我目前有限的知识,只知道下面两个方向:1. Hamilton 系统在现代...

发表评论

访客

看不清,换一张

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