如何创建一个类型数组,以后可以从列表中实例化?

时间:2018-05-18 14:59:06

标签: java class interface

我将在这个问题上加上一个事实,即我不是一名专业的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解决方案,但他们的意图可能有所不同。

当然,如果这可以通过更简单的方式完成,那么我对所有建议持开放态度。

1 个答案:

答案 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