Есть и другие связанные вопросы, например, 6624113 , 3403909 , 4516891 но мой вопрос проще и конкретнее.
Я хочу знать во время выполнения, с каким типом был параметризован мой класс - мне нужен объект Class типа параметра type. Из-за стирания типа выражение T.class
не работает, и в C # нет такой функции, как typeof(T)
, чтобы получить его.
Тем не менее, есть некоторое «сверхотражение», доступное через ParameterizedType и связанные с ним классы, что дает мне почти весь путь туда.
import java.lang.reflect.ParameterizedType;
public class MyClass<T> {
public static void main( String[] args ) {
new MyClass<Integer>().printTypeParam();
}
public void printTypeParam() {
class DummyT extends MyClass<T> {}
class DummyString extends MyClass<String> {}
ParameterizedType ptT =
((ParameterizedType) DummyT.class.getGenericSuperclass() );
ParameterizedType ptString =
((ParameterizedType) DummyString.class.getGenericSuperclass() );
System.out.println( "DummyT: " + ptT + " " + ptT.getActualTypeArguments()[0] );
System.out.println( "DummyString: " + ptString + " " + ptString.getActualTypeArguments()[0] );
}
}
Когда я запускаю вышеупомянутое, я вижу этот вывод:
DummyT: MyClass<T> T
DummyString: MyClass<java.lang.String> class java.lang.String
Как вы можете видеть, это работает, когда аргументы типа известны во время компиляции в строке кода, содержащей вызов getGenericSuperClass
, но там, где этот вызов сам имеет дело с обобщениями, он просто печатает имя введите параметр.
Можно ли как-нибудь заставить первую строку напечатать java.lang.Integer
вместо T
?