将List <animal>转换为List <dog> </dog> </animal>

时间:2012-08-17 03:26:31

标签: java generics

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

我是否知道是否有一种快速简便的方法可以做到这一点?

List<Dog> dogList = getAnimalList();

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

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

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

2 个答案:

答案 0 :(得分:6)

Generics inheritance与java继承原则略有不同。您需要使用?(通配符)

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

编辑:

Wildcard Guidelines:

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

答案 1 :(得分:1)

您的问题并不完全清楚,所以我只会解决可能的问题。

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

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));