Все мы помним про стирание типов (type erasure) в Java. Я уже описывал его. Да, компилятор стирает информацию об параметрах типа, но в некоторых случаях во время выполнения программы можно получить аргументы типа суперкласса. Для этого используется метод getGenericSuperclass(), который у нас есть аж с Java 1.5.
Для лучшего понимания надо привести пример. Класс MySuperclass:
1 2 3 4 5 |
public class MySuperclass<T> { public void method1(T arg0) { System.out.println(arg0); } } |
В дочернем классе в качестве аргумента типа укажем строку:
1 2 3 |
public class MyClass extends MySuperclass<String> { } |
Пример программы, использующей метод getGenericSuperclass():
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class Main { public static void main(String[] args) { Type t = MyClass.class.getGenericSuperclass(); ParameterizedType p = (ParameterizedType) t; Type[] a = p.getActualTypeArguments(); for (Type type : a) { System.out.println("type argument = " + type); } } } |
Запустим её на выполнение и в консоли увидим:
1 |
type argument = class java.lang.String |
Как видим, в определённых случаях даже на этапе выполнения можно добыть информацию об аргументах типа в Java.
Аналогично можно получить аргументы типа из суперкласса интерфейса, но там уже нужно использовать метод public Type[] getGenericInterfaces().