调用方法已经实现功能了 不理解为什么AnimalPlay类里的方法返回值接收不了
public abstract class Animal{
//按任务要求实现该类
private String name;
public Animal(){}
public Animal(String name) {
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void game();
}
public class Dog extends Animal{
//按任务要求实现该类
public Dog(){}
public Dog(String name){
super.setName(name);
}
@Override
public void game() {
System.out.println("小狗"+super.getName()+"在做游戏!");
}
}
public class Cat extends Animal {
public Cat(){}
public Cat(String name){
super.setName(name);
}
@Override
public void game() {
System.out.println("小猫"+super.getName()+"在做游戏!");
}
}
public class AnimalPlay {
public List<? extends Animal> animalGame(List<Animal> animal){
for (Animal item:animal) {
item.game();
}
return animal;
}
}
public class Test {
public static void main(String[] args) {
//定义List并添加Dog类对象
//定义List并添加Cat类对象
List<Animal> animals = new ArrayList<>();
Dog dogBD = new Dog("巴迪");
Dog dogDD = new Dog("豆豆");
Cat catHH = new Cat("花花");
Cat catFF = new Cat("凡凡");
animals.add(dogBD);
animals.add(dogDD);
animals.add(catHH);
animals.add(catFF);
//使用AnimalPlay类的方法,按照演示效果输出内容
AnimalPlay ap = new AnimalPlay();
List<Animal> list = ap.animalGame(animals);
}
}
正在回答 回答被采纳积分+1
同学你好,这是因为泛型约束的范围导致的,我们可以先分析一下同学代码中两个泛型的范围:
public List<? extends Animal> animalGame(List<Animal> animal)
在这个方法的参数列表中,约定了List中可以存储任意Animal类型的对象。由于Java支持多态的特性,所以此处可以是Animal或者Animal的任意子类。
在这个方法的返回值中,约定了List中可以存储存储任意Animal类型的对象。由于Java支持多态的特性,所以此处可以是Animal或者Animal的任意子类。
此时就会发现一个问题,假如在参数列表中存储的对象是Dog类型,那么返回时的泛型就应该是Dog而不是Animal,这就像之前多态时学习的:
Animal a = new Dog(); Dog d = a;
第二行代码显然是有错的,因为不能将父类型对象直接存储在子类型引用中,即使类型是匹配的。此处必须使用强制类型转换来完成。
在集合中也是一样的,如果尝试将一个元素都是父类型的集合,转换为一个元素都是子类型的集合,可能会出问题。所以实际上,在集合中,泛型是不支持多态的写法的。例如不能写
ArrayList<Animal> list = new ArrayList<Dog>();
所以,方法animalGame在被调用之后,由于其返回值是List<? extends Animal>的,那么接收的数据类型必须也是List<? extends Animal>,不能写为List<Animal>。
祝学习愉快~
- 参与学习 2053 人
- 提交作业 1490 份
- 解答问题 1316 个
2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星