JavaReflectionを使用してそれを行うことができます。それが常に良い考えであるかどうかはわかりませんが、それは確かに可能です。次に例を示します。
public class Test{
private List<String> list;
public static void main(String[] args) throws Exception{
Field field = Test.class.getDeclaredField("list");
Field f = field.getGenericType().getClass().getDeclaredField("actualTypeArguments");
f.setAccessible(true);
Type[] genericTypes = (Type[]) f.get(field.getGenericType());
System.out.println(genericTypes[0]);
}
}
または、パラメータ化されたタイプに直接キャストすることもできます。
public class Test{
private List<String> list;
public static void main(String[] args) throws Exception{
Field field = Test.class.getDeclaredField("list");
ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
Type[] actualTypes = parameterizedType.getActualTypeArguments();
System.out.println(actualTypes[0]);
}
}
どちらの例も次のように出力します。class java.lang.String
より完全な答えを残すために、マップについても同じことができます。ご覧のとおり、getActualTypeArguments()
メソッドはaType[]
を返し、 Mapの場合、キータイプはインデックス0になり、値タイプはインデックス1になります。例:
public class Test{
private Map<String, Integer> map;
public static void main(String[] args) throws Exception{
Field mapField = Test.class.getDeclaredField("map");
ParameterizedType mapParameterizedType = (ParameterizedType) mapField.getGenericType();
Type[] actualMapTypes = mapParameterizedType.getActualTypeArguments();
System.out.println(actualMapTypes[0]);
System.out.println(actualMapTypes[1]);
}
}
プリント:
class java.lang.String
class java.lang.Integer