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

标签 java android inheritance arraylist

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

相关文章:

java - 在java中乘以 double ?

android - ParseQueryAdapter 不获取项目

c# - 如何使用基构造函数实例化继承类?

java - Android:在行中创建按钮

java - Linux 中的 Watchdata 检查失败 - java.security.KeyStoreException : PKCS11 not found

android - Libgdx - 最大 Sprite 数

c# - 在 C# 中为不同的类使用类型化变量

c++ - 如何删除抽象类中类似的 const 和非 const 成员函数之间的代码重复?

java - 什么时候应该在我的 ColdFusion 应用程序中使用 Java?

java - 如何设置 Jersey JAX-RS 服务器端记录器级别?