卡卷网
当前位置:卡卷网 / 每日看点 / 正文

被java中

作者:卡卷网发布时间:2025-01-12 18:18浏览数量:75次评论数量:0次

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)用于消费者场景

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

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码