Используйте рефлексию для создания универсального параметризованного класса в Java - PullRequest
8 голосов
/ 16 июня 2011

Как я могу использовать отражение для создания универсального параметризованного класса в Java?

У меня есть

public class SomeClass<T> {
   public SomeClass<T>() {
   }
}

и мне нужен экземпляр.

Я пробовал варианты

Class c = Class.forName("SomeClass");

но не смог найти синтаксис, который позволил бы мне получить правильно типизированный экземпляр, например, скажем

SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();

Итак, как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 16 июня 2011

Java использует основанные на стирании обобщения (т.е. параметры типа стираются во время выполнения - например, List<Integer> и List<String> обрабатываются как один и тот же тип во время выполнения).Поскольку отражение по своей сути является функцией времени выполнения, параметры типа не используются или не используются вообще.

Другими словами, вы можете создавать экземпляры необработанного типа (SomeClass, а не SomeClass<T>), когда выиспользуя отражение.Затем вам придется вручную привести тип к общей версии (и сгенерировать предупреждение unchecked).

2 голосов
/ 16 июня 2011

Смотрите / ищите "Type erasure". Обобщение предназначено для времени компиляции, и оно не доступно во время выполнения, поэтому то, что вы пытаетесь, невозможно. Вам нужно использовать необработанный тип для отражения

1 голос
/ 16 июня 2011

Из-за стирания типа во время выполнения SomeClass - это все, что осталось от SomeClass<SomeType>.

...