当前位置:首页 > 每日看点

被java中

卡卷网2年前 (2025-01-12)每日看点286

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

分享给朋友:

相关文章

你有突破100个粉丝了吗?

你有突破100个粉丝了吗?

100粉已经过啦! 说说怎么过的吧,最开始疯狂的写回答,写想法,关注人数在50几以下持续有两周多,每天都关注变化,都是个位数增长,后来干脆不看了。 到第三周时突然一周增长了100多人,一天十几人,想想应该归功于多互动,给他人点赞评论,让自己…

每天5点就下班了,闲着也是闲着,有哪些副业可以推荐?

每天5点就下班了,闲着也是闲着,有哪些副业可以推荐?

今天整理了36个搞钱APP 可以先接触学习看看,然后选定一个感兴趣的方向去精进 要知道机会不是一下子来临的, 而一定是你前期做了很多准备 每天进步一点点,就像滚雪球一样 希望所以女生,能够在2024年提升自己, 立下一个新的搞钱Flag吧…

你手机里有哪些堪称神器的 App?

你手机里有哪些堪称神器的 App?

嗨嗨,我是赢酱~ 首先我认为对于我们有用的提升自我的都是手机里的神器 App。 一个人应该什么样子呢?在我从女孩子的角度看来,自律,上进,会打扮,情商高,会挣钱,独立,落落大方,这才是应该有的样子,我们可以借助手机不断学习改变 今天给大家准…

手机买16+256的还是12+512的好?

手机买16+256的还是12+512的好?

到底选大内存还是大存储,一直以来是很多朋友的纠结点,大内存意味着可以应用多开不卡顿,大存储则是可以存入更多文件、应用,如果两个配置价格差距不大(如0-200元),确实有点难选。 不过从实际体验出发,大存储的手机显然更应该优先选择才是。首先,…

有哪些网站,一旦知道,你就离不开了?

有哪些网站,一旦知道,你就离不开了?

这六个网站,一旦用过,基本上是离不开了。都是我超爱的一些网站,基本上每天都用。 1 地图生成器 第一个,我要给大家推荐的是地图生成器。可以下载到各省,各市,各县的svg格式的地图素材。 这些素材导入PPT中都是可以编辑的。 可以单独更改颜色…

如何进行 Elasticsearch 调优实践?

如何进行 Elasticsearch 调优实践?

面试官心理分析这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s ,坑爹了。第一次搜索的…

发表评论

访客

看不清,换一张

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