Дженерики Java, почему я не могу инстанцировать типа genericized [дубликат]

5
задан reevesy 11 September 2012 в 10:12
поделиться

5 ответов

Да, это довольно чертовски раздражает.

Работа, которую я использую, заключается в том, чтобы заставить клиента передать класс при построении нового foo - т.е.

public foo(Class<T> myClass)

Тогда вы можете использовать myClass.newInstance() вместо него.

8
ответ дан 18 December 2019 в 05:36
поделиться

При выполнении JVM не знает, что это так, что он не может создать новые объекты типа T. типов, стираются во время компиляции .

13
ответ дан 18 December 2019 в 05:36
поделиться

Это ограничение способа реализации дженериков Java. Для обеспечения совместимости кода, использующего дженерики, с унаследованным кодом перед дженериками, добавленными к языку, дженерики были реализованы с использованием стирания типа. Это вызывает много путаницы у людей, которые происходят из лангузов, таких как C++ и ожидают, что дженерик будет работать таким же образом.

Подробнее о последствиях этого здесь хорошая ссылка

-121--4541876-

Да, это чертовски раздражает.

При создании нового foo < T > , т.е.

public foo(Class<T> myClass)

Вместо этого можно использовать myClass.newInstance () .

-121--4541855-

Я бы всегда предпочитал творческую образец (фабрика, прототип,...). Особенно

 открытый foo (класс < T > myClass)

Вместо этого можно использовать myClass.newInstance () .

является плохим решением, поскольку T может не иметь пустого конструктора.

8
ответ дан 18 December 2019 в 05:36
поделиться

Это ограничение в том, как java реализует дженерики. Для обеспечения совместимости кода, использующего дженерики, с наследственным кодом до дженериков, которые были добавлены в язык, дженерики были реализованы с помощью стирания типов. Это вызывает много путаницы у людей, которые приходят из таких лангов, как C++, и ожидают, что дженерики будут работать таким же образом.

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

1
ответ дан 18 December 2019 в 05:36
поделиться

Временное решение

Вы можете использовать тип шаблона класса, если вы его подтипируете. См. Мой ответ на другой вопрос - Создание экземпляров обобщенного типа в java .

0
ответ дан 18 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: