我将在这个问题上加上一个事实,即我不是一名专业的Java程序员。我来自强大的C嵌入式系统背景,但在大学里是自学成才的Java。
我正在创建一个简单的程序,其中有许多不同的数据“生产者”类。每个类都生成某种数据输出产品。
ArrayList< Class<? extends OtherClass> > list = new ArrayList< Class<? extends OtherClass> >();
//Register producers based on some criteria for the analysis being done
list.add(Producer1.class);
list.add(Producer2.class);
//Some time later, I want to create instances of those classes and link them to a 'report'
Report report = new Report();
report.addProducer( new list.get(0)() );
当然,上面的代码不起作用。我能够创建类类型的ArrayList,但我无法在以后实例化它们(至少我无法找到正确的语法)。
我最初也打算用interfaces
执行此操作,但创建类数组的语法似乎与上面的代码示例中的extends
不同。我尝试了以下方法,但语法检查失败了:
ArrayList< Class<? implements OtherClass> > list = new ArrayList< Class<? implements OtherClass> >();
我搜索了一个合适的答案,但不知道要问的正确问题/术语可能会使这很困难。我找到了this解决方案,但他们的意图可能有所不同。
当然,如果这可以通过更简单的方式完成,那么我对所有建议持开放态度。
答案 0 :(得分:2)
假设列表中的所有类都具有no-arg构造函数,您可以使用
实例化它们list.get(0).newInstance()
这也适用于接口
List<Class<? extends SomeInterface>>
制作人界面:
public interface Producer {
void produce();
}
首次实施:
public class Producer1 implements Producer {
@Override
public void produce() {
System.out.println("Producer 1");
}
}
第二次实施:
public class Producer2 implements Producer {
@Override
public void produce() {
System.out.println("Producer 2");
}
}
报告类:
public class Report {
private final List<Producer> producers = new ArrayList<>();
public void addProducer(Producer producer) {
producers.add(producer);
}
public void produce() {
producers.forEach((p) -> p.produce());
}
}
运行以下主要方法:
public static void main(String[] args) {
Report report = new Report();
List<Class<? extends Producer>> producers = new ArrayList<>();
producers.add(Producer1.class);
producers.add(Producer2.class);
producers.forEach((p) -> {
try {
report.addProducer(p.newInstance());
} catch (InstantiationException | IllegalAccessException ex) {
System.out.print("Ooops");
}
});
report.produce();
}
将输出到控制台:
Producer 1
Producer 2