class Foo<T>
на generic параметре T
невозможно выполнить никакой оператор: нельзя взять его .class
, нельзя применить его в instanceof
. Также и вызов на нем оператора new приведет к ошибке.Причина этих ограничений кроется в стирании типов. Дженерик параметры правильно воспринимать скорее как ограничения типов, чем как конкретные типы. Эти ограничения действуют для более строгих проверок на этапе компиляции. В рантайме же информация о конкретных переданных типах-параметрах стирается. А все эти операторы выполняются именно в рантайме.
Стандартный простой способ действия здесь – кроме значения типа T передавать еще и объект-дескриптор для этого типа, экземпляр класса
Class<T>
. Объект может быть создан из дескриптора рефлекшеном.Но существует один хак, способный справиться со стиранием типов. Тип-параметр все-таки остается в одном месте в рантайме. Метод метакласса наследника определившего конкретный тип
getGenericSuperclass()
возвращает класс, которым параметризован родитель.