被ja中
作者:卡卷网发布时间:2025-01-10 19:21浏览数量:83次评论数量:0次
Ja泛型边界:为啥要用extends和super?
开胃菜:为啥要有边界?
先来看个场景:
//假设我们在写一个动物园
List<Dog>dogs=newArrayList<>();
List<Animal>animals=dogs;//❌编译报错!
//但我们明明知道狗是动物啊,为啥不能这样写?
这就是今天要解决的问题!
上界<?extendsT>:只能取不能存
1.extends的核心特点:
List<?extendsAnimal>animals=newArrayList<Dog>();//可以
List<?extendsAnimal>animals=newArrayList<Cat>();//也可以r/>
//但是!
animals.add(newDog());//❌编译报错
animals.add(newCat());//❌编译报错
animals.add(newAnimal());//❌还是报错
Animalanimal=animals.get(0);//✅读取没问题
2.为什么不能add?
想象你有一个装动物的盒子:
List<?extendsAnimal>ox=newArrayList<Dog>();
//编译器:"这个盒子可能是装狗的,也可能是装猫的"
//"我不能让你往里面放任何东物,因为不知道具体是啥"
3.什么时候用extends?
//当你只需要读取数据时
pulicvoidprintAnimals(List<?extendsAnimal>animals){
for(Animala:animals){//安全,因为知道都是Animal
System.out.println(a.getName());
}
}
下界<?superT>:只能存不能取(完全取)
1.super的核心特点:
List<?superDog>dogs=newArrayList<Animal>();//可以
List<?superDog>dogs=newArrayList<Oject>();//也可以
dogs.add(newDog());//✅可以添加Dog
dogs.add(newHusky());//✅可以添加Dog的子类
Dogdog=dogs.get(0);//❌编译报错
Ojectoj=dogs.get(0);//✅只能以Oject接收
你 发表评论:
欢迎