Как я могу создать новый экземпляр универсального класса
Я создаю такую функцию
public <T extends ClientCoporate> void myFunction(List<T> clients){
T client = new T(); // issue
....
}
Ошибка IDE Cannot instantiate the type T
Простой вопрос, как я могу создать новый экземпляр любого расширяемого класса ClientCoporate
Вот? Я пытаюсь найти, но не надеюсь, что если вы найдете какой-либо дублирующий вопрос, не стесняйтесь поставить мне флажок. Благодарю.
2 ответа
Одна из причин, по которой вы не можете сделать это - хотя, вероятно, есть по крайней мере еще пара - заключается в том, что конкретный тип T неизвестен в тот момент, когда вы пытаетесь его построить. Мы не можем точно сказать, что конкретный тип T имеет конструктор без аргументов. Единственное, что мы знаем, это то, что ClientCoporate
,
Рассмотрим следующий класс:
class MyClientCoporate extends ClientCoporate // or implements, it doesn't matter
{
private MyClientCoporate() {}
}
Мы не могли использовать new T()
на этом классе, потому что конструктор не является публичным. Это одна из причин, по которой компилятор запрещает это.
Если вы можете изменить сигнатуру метода, я бы сделал что-то вроде этого:
public <T extends ClientCoporate> void myFunction(List<T> clients, Supplier<T> constructor){
T client = constructor.get();
...
}
Пример использования:
myFunction(aList, SomeClientCoporateClass::new);
Ты не можешь
Поскольку дженерики стираются во время выполнения, и компилятор не знает, какой тип объекта создавать. T
просто заполнитель, поэтому пытаться создавать его экземпляры незаконно.
Обычно эта проблема решается
public <T extends ClientCoporate> void myFunction(Class<T> clazz, List<T> clients){
T client = clazz.getDeclaredConstructor().newInstance(); ....
}