被java中
作者:卡卷网发布时间:2025-01-12 18:18浏览数量:75次评论数量:0次
Java泛型边界:为啥要用extends和super?
开胃菜:为啥要有边界?
先来看个场景:
// 假设我们在写一个动物园系统
List<Dog> dogs = new ArrayList<>();
List<Animal> animals = dogs; // ❌ 编译报错!
// 但我们明明知道狗是动物啊,为啥不能这样写?
这就是今天要解决的问题!
上界 <? extends T>:只能取不能存
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
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"
extends | 不能存 | 能取(Animal) | 用于生产者场景 |
super | 能存(Dog及子类) | 不能完全取(只能取Object) | 用于消费者场景 |
如果觉得有帮助请点个赞!
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
相关推荐

你 发表评论:
欢迎