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

被java中

卡卷网1年前 (2025-01-12)每日看点231

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

开胃菜:为啥要有边界?

先来看个场景:

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

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

上界 <? extends T>:只能取不能存

被java中  第1张

1. extends的核心特点:

List<? extends Animal> animals = new ArrayList<Dog>(); // 可以 List<? extends Animal> animals = new ArrayList<Cat>(); // 也可以r/> // 但是! animals.add(new Dog()); // ❌ 编译报错 animals.add(new Cat()); // ❌ 编译报错 animals.add(new Animal()); // ❌ 还是报错 Animal animal = animals.get(0); // 读取没问题

2. 为什么不能add?

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

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

3. 什么时候用extends?

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

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

1. super的核心特点:

List<? super Dog> dogs = new ArrayList<Animal>(); // 可以 List<? super Dog> dogs = new ArrayList<Object>(); // 也可以 dogs.add(new Dog()); // ✅ 可以添加Dog dogs.add(new Husky()); // ✅ 可以添加Dog的子类 Dog dog = dogs.get(0); // ❌ 编译报错 Object obj = dogs.get(0); // 只能以Object接收

2. 为什么不能完全get?

List<? super Dog> box = new ArrayList<Animal>(); // 编译器:"这个盒子可能是装Animal的,也可能是装Object的" // "我只能保证取出的东西是个Object"

3. 什么时候用super?

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

经验法则:PECS原则

Producer Extends, Consumer Super

被java中  第2张

1. 生产者用extends

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

2. 消费者用super

// 当你需要往集合中写入数据时 public void addDogs(List<? super Dog> dogs) { // 这里的集合是数据的消费者 dogs.add(new Dog()); }

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

// 不要这样 public void confusingMethod(List<?> list) {...} // 要这样 public <T> void clearMethod(List<T> list) {...}


最后做个总结

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

被java中  第3张

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

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

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

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

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

分享给朋友:

相关文章

创业值得吗?

许多企业主会说,是的。企业所有权可能意味着利润以及一定程度的财务稳定性。此外,对于小企业主来说,它提供了摆脱朝九晚五工作限制的机会,这些工作可能不会给您带来快乐或成就感。也就是说,创业并非没有挑战——从提出一个有利可图的想法,到获得资金,再...

百度收录又开始“作”了,用“快速抓取”替代“快速收录”

百度收录又开始“作”了,用“快速抓取”替代“快速收录”

作为国内不得不用的知名搜索引擎“百度”,对于网站收录的规则,又有新的升级。以前有个快速收录,我们可以通过WordPress插件,免费快速提交给百度。但是现在这个功能没了,取而代之的是“快速抓取”,如下图想要使用此功能,需要加入“VIP俱乐部...

怎么用游戏搬砖挣钱呢?

怎么用游戏搬砖挣钱呢?

今天,我把我多年操作的经验分享出来,以供各位老板们学习借鉴,胆小的老板就离开吧,心里承受能力太弱了,会刷新你的认知的。有些新人在计算收益的时候,会以机器数来计算,其实是有误区的,比如,一台机器一个月搞400元,平均每天搞13元钱,搞上100...

现在手里有一万闲钱,买什么币好?

今天是2024年7月29日,看看我的持仓吧。只有几百刀的那些微持仓就不说了,以下持仓都在几千刀~几万刀不等。不构成任何投资建议,成本是多次买入的大致均摊成本$TIA 成本0$DYM 成本0 $SAGA 成本0$STRK 成本0$ETHFI...

开发了个小程序,咋推广呢?

要是开发了个小程序,想推广的话,可以先从自己的朋友圈子下手,让亲戚朋友都帮忙转发宣传,这样能先有点人气。然后去一些跟你的小程序相关的论坛、社区啥的,发帖子介绍介绍,吸引有兴趣的人。还能找些网红、博主合作,要是他们觉得你的小程序不错,帮忙推荐...

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

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

发表评论

访客

看不清,换一张

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