java - 具有抽象类的构造函数 - 不接受特定的

标签 java

我有一个抽象类 Animal,它包含 Horse 和 Pig 的扩展类。我还有一个农场类和该类中的一个构造函数,我想用它来填充农场中的动物列表。但是编译器显示错误。

我将列出 Farm 类,因为我认为这将说明问题而无需列出整个类:

import java.util.ArrayList;


public class Farm {
    public ArrayList<Animal> farmlist;
    { 
        System.out.println("Initializing the farmlist...");
        farmlist = new ArrayList<>();
        farmlist.add(new Horse()); // There will always be a Horse in the farm.
    }

    public Farm() {
        System.out.println("Blank constructor called..");

    }

    public Farm(Animal animal, int n) {
        System.out.println("Multiple animal constructor called...");
        for (int i = 1; i <= n; i++) {
            farmlist.add(new animal());
        }
    }
}

最后一行代码给出了一个编译器错误,它似乎不允许我传入 Pig 类型,例如,如果我想的话。这个想法是,它会将我传入的任何类型的多种动物添加到农场列表中。我不明白为什么它不允许我这样做,或者我需要用什么方式来“表达”我想做的事情。

最佳答案

The idea is that it will add multiple animals of whatever type I pass in to the farmlist.

在这种情况下,您需要传入Animal类型 - 而不是对Animal 的实例 的引用,这就是你现在正在做的事情。我怀疑你真的想要这样的东西:

public Farm(Class<? extends Animal> animalType, int n)
       throws ReflectiveOperationException {
    System.out.println("Multiple animal constructor called...");
    for (int i = 0; i < n; i++) {
        farmlist.add(animalType.newInstance());
    }
}

这将尝试对您传入的任何类型调用可访问的无参数构造函数,n 次。你会这样调用它:

Farm farm = new Farm(Pig.class, 10);

另一种选择(最适合 Java 8+)是传入一个创建新动物的函数。例如:

public Farm(Supplier<? extends Animal> supplier, int n) {
    for (int i = 0; i < n; i++) {
        farmlist.add(supplier.get());
    }
}

然后调用它:

Farm farm = new Farm(() -> new Pig(), 10);

请注意,如果您将 kocko 的答案与您的原始签名一起使用,您最终不会得到多个独立的动物对象 - 您最终会得到包含多个对相同动物对象的引用的列表。了解对象和引用在 Java 中的工作方式非常重要 - 这可能是从一本好书或教程中学到的最好方法。

关于java - 具有抽象类的构造函数 - 不接受特定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942399/

相关文章:

java - 如何使用 HttpURLConnection 与网站交互?

java - 进程挂起我的应用程序

java - Gson 自定义序列化不适用于 java.lang.Object

Java wait() 和 notifyAll() 恢复最旧的线程

java - 为什么我无法从简单的 java 类访问 Assets 文件夹?

java - 如何计算非常大的 BigInteger 数字的 GCD 而不会出现 stackoverflow 异常?

java - 文本字段 tableNum 不会将 String 从另一个类传递到 tableLabel

java - libjvm.so 中的 SIGSEGV Java fatal error 导致 JVM 频繁崩溃

java - 最大有效时间由 4 位数字组成

java - 关于 JSP 和 Signed applet