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

被java中

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

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

分享给朋友:

相关文章

为何 Linus 一个人就能写出这么强的系统,中国却做不出来?

为何 Linus 一个人就能写出这么强的系统,中国却做不出来?

我给你举个真实的例子。。有一个人叫高伟东,在哈尔滨工作。在2012年做了一个APP。使用词根词缀背单词。名字叫:词根词缀词典这个人编辑了2300余条词根,给10万多条单词建立了词根索引,整理了50多万条的单词记忆方法,包括新版本的诸多新功能...

Photoshop 有哪些使用技巧?

Photoshop 有哪些使用技巧?

不看后悔系列!本篇分享25个PS实用的技巧!不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。另外我的知乎也写了接近200篇PS的技巧,超级合集分享!分享25个关于PS的技巧一、快速制作文字倒影1、新建文档,1500×100...

腾讯文档回收站彻底删除文件真的找不回来了吗?

趁早打电话联系腾讯文档的人可能还有救,一般这种都是数据库里标记为删除,文件还没有实际删除,然后经过一段时间后程序统一进行真删除。这个“一段时间”可长可短,可能是一小时也可能是几天几个月甚至几年,要看腾讯服务器的程序是怎么写的。不过你联系腾讯...

打印速度慢,是不是打印机cpu不行?

打印速度慢,是不是打印机cpu不行?

打印机是机械设备,cpu内存硬盘它也有但这只是它的电控部分,打印机类似于汽车属于机电一体化设备和电脑不是一个类型的产品。很多人总是认为打印机和电脑是一类产品,实际上这是一个误区,电脑是it(Information Technology)信息...

用红米手机会很丢人吗?

前些日子遇到了一位快递小哥,京东的,签收小哥年纪不算大,目测二十多岁他的手机上全是一道道极严重的划痕,有点卡,他开热点了,热点名就是手机型号,红米9a,我父母的同款现在他那边操作了一会,然后又是我这边操作了一会小哥看着我手机刷刷的,颇有些好...

什么样的网站能快速捕获你的心?

什么样的网站能快速捕获你的心?

大家好,我是程序员鱼皮。大家如果平时使用网站或产品时出现了问题,一般都会去寻找 “联系客服” 的位置,从而获得人工的帮助。我们团队的面试刷题产品 - 面试鸭最近就遇到了这样一个难题:明明我们网站右下角就有联系客服按钮、而且我们每道面试题目下...

发表评论

访客

看不清,换一张

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