当我们知道 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();
}
}
假设我确定一个列表仅包含扩展 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();
}
}