您可以使用Java Reflection来做到这一点。不知道这是否总是一个好主意,但这肯定是可能的。这是一个例子:
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]);
}
}
或者,您可以直接转换为 ParameterizedType,如果您觉得更好的话:
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
现在只是为了留下更完整的答案,对Map也可以这样做。如您所见,该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