У меня есть параметризованный класс. Я хотел бы получить имя класса, представленного именем класса. Например, я хочу сделать следующее:Имя класса доступа параметризованного типа
public T foo(){
System.out.println(T.class.getName());
}
У меня есть параметризованный класс. Я хотел бы получить имя класса, представленного именем класса. Например, я хочу сделать следующее:Имя класса доступа параметризованного типа
public T foo(){
System.out.println(T.class.getName());
}
Java-дженерики не работают таким образом. Если у вас есть ограничения на T, вы можете получить доступ к границам, запросив определение переменной типа. Например .:
public class Foo<T extends Bar>{}
позволит вам получить в Bar
, но не подтипа Bar
вы фактически используете. Это не работает, извините.
Прочтите Java Generics FAQ для получения дополнительной информации.
BTW: Одним из распространенных решений этой проблемы является передача подтипа T в ваш класс, например.
public T foo(Class<? extends T> tType){
System.out.println(tType.getName());
}
Я знаю, что это громоздко, но все это позволяет использовать Java-дженерики.
Собственно, вы можете получить, что такое 'T'. См. Мой ответ. (Не знаю, почему это было опущено!) – ziesemer
@ziesemer вы можете получить только на границах, которые на самом деле там. Если вышеупомянутое T было объявлено 'T extends Something', вы могли бы получить что-то часть. Но если ваши переменные типа не имеют границ, вам нечего делать. –
Вы не можете сделать это, так как T
не известно во время компиляции. Вы могли бы достичь чего-то подобного, как так:
public void foo(T t) {
System.out.println(t.getClass().getName());
}
Обратите внимание, что это берет экземпляр T
и будет распечатать имя своего динамического типа.
Независимо от того, является ли это достаточно хорошей заменой, зависит от вашего варианта использования.
Кроме того, это дает вам имя класса 't', которое может быть подклассом параметра типа. –
@StephenC: Это то, что я имел в виду под «* динамическим типом». – NPE
public T foo(T t){
System.out.println(t.getClass().getName());
}
Спасибо, Шон. Забыл. – Thom
http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime возможный дубликат –
Да, дубликат, я согласен. Как это исправить? – Thom