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