2012-01-23 4 views
0

У меня есть параметризованный класс. Я хотел бы получить имя класса, представленного именем класса. Например, я хочу сделать следующее:Имя класса доступа параметризованного типа

public T foo(){ 
    System.out.println(T.class.getName()); 
} 
+0

Спасибо, Шон. Забыл. – Thom

+0

http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime возможный дубликат –

+0

Да, дубликат, я согласен. Как это исправить? – Thom

ответ

1

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-дженерики.

+0

Собственно, вы можете получить, что такое 'T'. См. Мой ответ. (Не знаю, почему это было опущено!) – ziesemer

+0

@ziesemer вы можете получить только на границах, которые на самом деле там. Если вышеупомянутое T было объявлено 'T extends Something', вы могли бы получить что-то часть. Но если ваши переменные типа не имеют границ, вам нечего делать. –

2

Вы не можете сделать это, так как T не известно во время компиляции. Вы могли бы достичь чего-то подобного, как так:

public void foo(T t) { 
    System.out.println(t.getClass().getName()); 
} 

Обратите внимание, что это берет экземпляр T и будет распечатать имя своего динамического типа.

Независимо от того, является ли это достаточно хорошей заменой, зависит от вашего варианта использования.

+0

Кроме того, это дает вам имя класса 't', которое может быть подклассом параметра типа. –

+0

@StephenC: Это то, что я имел в виду под «* динамическим типом». – NPE

0
public T foo(T t){ 
    System.out.println(t.getClass().getName()); 
} 
Смежные вопросы