gpt4 book ai didi

java - 如何为每个子类创建一个 ArrayList?

转载 作者:行者123 更新时间:2023-12-01 17:53:07 25 4
gpt4 key购买 nike

我正在尝试创建一个可供一个抽象类的所有子类使用的ArrayList,但对象类型应该是子类的。

为了简单起见,这里有一个例子:

有一个名为“Animal”的抽象类,还有三个子类,名为“Dog”、“Cat”、“Pig”。所以,我想做一个'ArrayList<Animal> all ',子类应该使用这个列表来存储它们列表中的对象。所以,必须有一个' ArrayList<Dog> ', ' ArrayList<Cat> '和'ArrayList<Pig> ' 等等。我不想循环遍历“Animal”类,然后转换每个对象,因为这将使非继承的方法和值无法访问...

我想这样做,这样我就可以更快地迭代对象。

最佳答案

要为每个子类型提供其类型的列表,请将 Animal 设为通用。

在 Animal.java 中:

public class Animal<AnimalType extends Animal> {
public List<AnimalType> getAll() {
return all;
}
private List<AnimalType> all = new ArrayList<>();
}

在 Dog.java 中:

public class Dog extends Animal<Dog> {
public void doSomething() {
for (Dog dog: getAll()) {
}
}
}

通过使动物成为“通用”,您通常会想要指代您正在处理的特定类型的动物。因此,如果您将变量声明为 Animal 类型,您将需要包含类型信息(否则,您将收到有关原始类型的警告)。例如:

Animal<Dog> myFirstDog = ...;

如果您想泛指动物,那么您可以这样做:

Animal<?> myFirstPet = ...;

如果你让你的动物层次结构更有趣并且更通用,那么你可能会说:

Animal<? extends Canine> ...

可能会匹配 Animal、Animal 或 Animal。

在最后一个例子中:

在 Canine.java 中:

public class Canine extends Animal<Canine> {
}

在 Dog.java 中:

public class Dog extends Canine<Dog> {
}

在 Coyote.java 中:

public class Coyote extends Canine<Coyote> {
}

关于java - 如何为每个子类创建一个 ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47755921/

25 4 0