У меня возникли проблемы с заводским шаблоном при использовании дженериков. У меня есть этот интерфейс, общий на все:Завод по производству генераторов Java
public interface Connection<T> {
/* methods */
}
Очевидно, что у меня есть эта реализация:
public class ImplConnection<V> implements Connection<V> {
/* body */
}
Тогда у меня есть этот завод, который должен создать экземпляр связи:
public class ConnectionFactory<V, C extends Connection<V>> {
private final Class<V> contentType;
private final Class<C> connectionType;
public ConnectionFactory(Class<V> contentType, Class<C> connectionType) {
this.contentType = contentType;
this.connectionType = connectionType;
}
public C newConnection() {
try {
return connectionType.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Я пытаюсь создать экземпляр соединения во время выполнения с помощью этого (я использую Integer
в качестве параметра для общего типа):
connectionFactory = new ConnectionFactory<Integer, Connection<Integer>>(Integer.class, Connection.class);
, но он говорит:
The constructor ConnectionFactory <Integer,Connection<Integer>>(Class<Integer>, Class<Connection>) is undefined.
Это классическая проблема Java. Ваш конструктор запросит «Класс», но вам нужен «Класс <Соединение >». К несчастью, вы не можете иметь такую вещь для стирания типов дженериков. –
Вы, вероятно, не хотите передавать 'Connection.class', так как это интерфейс, и вам нужно создать экземпляр данного класса connectionType. Полагаю, вы на самом деле выберете класс во время выполнения, используя отражение, не так ли? Как вы его загружаете? –