繁体   English   中英

将List <Animal>转换为List <Dog>

[英]Casting List<Animal> to List<Dog>

我有一个Animal.Class和Dog类,它扩展了Animal.Class

我可以知道是否有一种快速简便的方法吗?

List<Dog> dogList = getAnimalList();

public List<Animal> getAnimalList(){
     List<Animal> animalList = new LinkedList<Animal>();
     return animalList;
}

除非绝对必要,否则我不希望再看整个动物名单。

dog类只包含一个额外的布尔值以用于其他检查目的。

泛型继承与java继承原则略有不同。 你需要用? (通配符)

List<? extends Animal> dogList = getAnimalList();

编辑:

通配符指南:

  1. 使用extends关键字定义带有上限通配符的“in”变量。
  2. 使用super关键字,使用下限通配符定义“out”变量。
  3. 在可以使用Object类中定义的方法访问“in”变量的情况下,使用无界通配符。
  4. 在代码需要作为“in”和“out”变量访问变量的情况下,不要使用通配符。

你的问题并不完全清楚,所以我就解决什么可能是您的问题。

如果你有动物名单,其中包含多种动物:

List<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Hippo());

并且您希望将该列表的元素过滤到特定的子类型,然后您需要迭代该列表并检查/强制转换为子类型:

List<Dog> dogs = new ArrayList<>();

for (Animal animal : animals) {
    if (animal instanceof Dog) {
        dogs.add((Dog)animal);
    }
}

使用Guava更容易完成:

List<Dog> dogs = Lists.newArrayList(Iterables.filter(animals, Dog.class));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM