Как создать массив типов классов, которые позже могут быть созданы из списка? - PullRequest
0 голосов
/ 18 мая 2018

Я поставлю этот вопрос перед фактом, что я не профессиональный 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> >();

Я искал подходящий ответ, но не зная правильного вопроса / терминологии, которую можно задать, это может усложнить.Я нашел это решение, но их намерения могли быть другими.

Конечно, если это можно сделать более простым способом, тогда я открыт для всех предложений.

1 Ответ

0 голосов
/ 18 мая 2018

Предполагая, что все классы в списке имеют конструктор без аргументов, вы можете создать их экземпляр с помощью

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...