今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

子类list转父类list

最近在开发的过程中遇到一个接口需要一个父类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>的子类,所以不是父类引用指向子类对象

 

分享到:

专栏

类型标签

网站访问总量