3

我有一个扩展 Animal.Class 的 Animal.Class 和 Dog 类

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

List<Dog> dogList = getAnimalList();

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

除非绝对必要,否则我不想再查看整个动物列表。

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

4

2 回答 2

6

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

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

编辑:

通配符指南:

  1. 使用 extends 关键字,使用上限通配符定义“in”变量。
  2. 使用 super 关键字,使用下界通配符定义“out”变量。
  3. 如果可以使用 Object 类中定义的方法访问“in”变量,请使用无界通配符。
  4. 如果代码需要以“in”和“out”变量的形式访问变量,请不要使用通配符。
于 2012-08-17T03:28:27.917 回答
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));
于 2012-08-17T03:46:25.790 回答