我正在尝试创建一个可供一个抽象类的所有子类使用的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/