Как я могу создать новый экземпляр универсального класса

Я создаю такую ​​функцию

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();        ....
}
Другие вопросы по тегам