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

被java中

卡卷网10个月前 (01-12)每日看点163

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建设的网站为什么不推荐国内机房?

WordPress建设的网站为什么不推荐国内机房?

我劝大家不要用WordPress做国内网站,不要用国内机房的主机。原因如下:1 WordPress 很多主题和插件都是国外开发的,特别是付费版本,需要联网验证,或者远程写入。国内机房的虚拟主机和服务器大概率会屏蔽或者阻断这些连接,无法完成任...

有什么音乐软件可以全部免费下载歌曲?

有什么音乐软件可以全部免费下载歌曲?

作为音乐发烧友,我几乎把市面上所有的发烧碟、试音碟,全都给收藏,下载下来了!音质都是无损的,品质特别高,有5.1环绕的、有DTS的、有中文的、有英文的。大家可以看看这个音乐目录,大概有30万张专辑。有需要下载软件的朋友,可以双击屏幕,然后搓...

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

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

自媒体如何快速起步?

自媒体如何快速起步?

有两种经验,可供参考。第一种是:现象级的爆火、爆款,这种情况捞到钱,实现财务自由的人并不多,但确实存在。只不过非要说清楚为什么这个账号可以火、可以短时间内赚到普通人一辈子赚不到的钱,他们自己也不一定能说清楚,因为赶上了风口(内外部情况)。举...

小米15就要来了,不知道小米15值不值得买?

小米15就要来了,不知道小米15值不值得买?

俗话说得好,好饭不怕晚,看似有点姗姗来迟的小米15系列,一官宣就迅速登上热搜。在此次小米14发布会上,雷军曾说过小米14将是最后一代3999起的旗舰,那么这一次涨价了的小米15,值不值得买呢?下面为大家总结一下小米15将会有哪些升级点:软件...

网易云音乐上看到过最触动的热评是什么?

网易云音乐上看到过最触动的热评是什么?

1.“昨天晚上洗澡的时候,我忘记拿毛巾了,喊了声妈妈帮我拿下毛巾,正当我伸出左手准备接毛巾的时候,我愣了一下,又换了右手。”希望你永远不会听懂这句话,永远都不要懂。——网易云热评《关键词》2.小时候跟着父亲去城里卖西瓜,害怕同学会看到我,就...

发表评论

访客

看不清,换一张

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