当我们知道 List<A> 仅包含 B 时如何将 List<A> 向下转换为 List<B>

How to downcast List<A> to List<B> when we know List<A> contains only B

假设我确定一个列表仅包含扩展 A 的类型 B 的元素。这是一个代表我的情况的示例:

public static class Animal {
    public void feed() {}
}
public static class Cat extends Animal {
}
public static class Zoo {
    public List<Animal> m_animals;
    
    public Zoo() {
        m_animals = new ArrayList<Animal>();
    }
    public void feedAnimals() {
        for(Animal animal : m_animals)
            animal.feed();
    }
}
public static class CatZoo extends Zoo {
    public void addCat(Cat cat) {
        m_animals.add(cat);
    }
    List<Cat> getCats() {
        List<Cat> cats = new ArrayList<Cat>();
        for(Animal cat : m_animals)
            cats.add((Cat) cat);
        return cats;
    }
}

我觉得我做错了什么,但我不能完全确定。 CatZoo 仍然是 Zoo,我需要 Zoo 方法。 Cat 绝对是一个 Animal,我需要 Animal 方法。任何处理 CatZoo 的人都应该只处理 Cat 而不是 Animal。但是 getCats() 变得非常低效。有更好的方法吗?

我认为您要查找的是通用 Zoo。这样你就可以将通用逻辑移动到基础class,同时让子classes知道他们正在使用什么类型:

public static class Zoo<A extends Animal> {
    public List<A> m_animals;

    public void add(A animal) {
        m_animals.add(animal);
    }
}

public static class CatZoo extends Zoo<Cat> {
    public void meow() {
        for (Cat cat : m_animals)
            cat.meow();
    }
}