Мой вопрос таков:
Почему нельзя создать экземпляр универсального типа с помощью new T (), а вместо этого с помощью newInstance () класса Class, который вы можете сделать?
Мой вопрос таков:
Почему нельзя создать экземпляр универсального типа с помощью new T (), а вместо этого с помощью newInstance () класса Class, который вы можете сделать?
T
не имеет подходящего конструктора? 06.07.2010 Вам нужно использовать отражение (newInstance()
), потому что во время компиляции класс, конструктор которого необходимо связать, неизвестен. Таким образом, компилятор не может сгенерировать ссылку.
Из-за стирания типа: универсальный тип во время выполнения не знает, что такое T
, поэтому он не может вызвать правильный конструктор.
Дополнительную информацию см. В разделе часто задаваемых вопросов Анжелики Лангер о стирании типа.
Возможно, вы смотрите на этот шаблон (взятый из ответа на другой вопрос):
private static class SomeContainer<E>
{
E createContents(Class<E> clazz)
{
return clazz.newInstance();
}
}
Здесь, когда мы создаем SomeContainer
, мы параметризируем экземпляр конкретным классом (например, String
). createContents
примет только String.class
, а String.class.newInstance()
создаст новую (пустую) строку.
Если вы знаете тип во время компиляции, используйте «new Whatever ()». Если вы не знаете тип во время компиляции, но можете получить для него объект Class, используйте newInstance ().
В 99% случаев я знаю тип и использую «new Whatever ()».