Это можно сделать, но стирание типа может сделать это очень сложно. Как обсуждают другие ответы, вам нужно либо создать подкласс ParameterizedClass
, либо добавить поле типа T
в ParameterizedClass
и код отражения, который вам нужен делать это запутанно.
В этих обстоятельствах я рекомендую обойти проблему следующим образом:
class ParameterizedClass<T> {
private Class<T> type;
/** Factory method */
public static <T> ParameterizedClass<T> of(Class<T> type) {
return new ParameterizedClass<T>(type);
}
/** Private constructor; use the factory method instead */
private ParameterizedClass(Class<T> type) {
this.type = type;
}
// Do something useful with type
}
Благодаря логическому выводу типа Java для статических методов, вы можете создать свой класс без излишних шаблонов:
ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class);
Таким образом, ваш ParameterizedClass
является полностью универсальным и типобезопасным, и у вас по-прежнему есть доступ к объекту класса.
РЕДАКТИРОВАТЬ : обратился к комментарию
Вы можете использовать этот трюк в вашем конструкторе: (см. http://www.hibernate.org/328.html)
Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Но я полагаю, что этот код работает только тогда, когда класс является подклассом и экземпляр подкласса выполняет его.
Это в основном проблемная тема, поскольку она работает только при определенных условиях, например ожидаемых (особенно в сложных сценариях).
Но Ксебия опубликовала хорошую статью в целом.
Если вы имеете в виду только от самого объекта, вы не можете. Стирание типа означает потерю информации.
Если у вас есть поле , которое использует параметризованный тип с конкретным аргументом типа, эта информация сохраняется.
См. Часто задаваемые вопросы по обобщениям Анжелики Лангер , и особенно раздел , посвященный стиранию типов .