最近在开发的过程中遇到一个接口需要一个父类list,二现有对象是查询出来的子类list,想当然的直接子类list赋值给父类list的引用,结果报错了。让我们来回顾一下该问题。
1.创建父类Cat
public class Cat {
private String name;
private String weight;
//get,set
}
2.子类BlankCat
public class BlankCat extends Cat {
private String name;
private String weight;
private String color;
//get,set
}
3.Animal类
public class Animal {
List<Cat> cats;
public Animal(List<Cat> cats){
this.cats = cats;
}
}
4.测试类
List<BlankCat> blankCatList =new ArrayList<BlankCat>();
BlankCat bc1= new BlankCat();
bc1.setColor("blank");
bc1.setName("Bill");
bc1.setWeight("10");
BlankCat bc2= new BlankCat();
bc2.setColor("blank");
bc2.setName("Mark");
bc2.setWeight("12");
blankCatList.add(bc1);
blankCatList.add(bc2);
List<Cat> cats =blankCatList;//Incompatible types.
Animal animal = new Animal(blankCatList);//Animal(java.util.List<com.zl.lennon.Cat>)in Animal cannot be applied to(java.util.List<com.zl.lennon.BlankCat>)
5.解决办法
List<? extends Cat> cats =blankCatList;
Animal animal = new Animal(blankCatList);
List<? extends Cat> genericCats= animal.getCats();
for(Cat cat:genericCats){
System.out.println(cat.getName());
}
List<Cat> allCats = new ArrayList<Cat>();
for(BlankCat bc:blankCatList){
allCats.add(bc);
}
List<Cat> a=new ArrayList<Cat>(blankCatList);
6.总结
归根揭底还是基础不够扎实。虽然BlankCat是Cat的子类但List<BlankCat>不是List<Cat>的子类,所以不是父类引用指向子类对象
分享到: