这只是一个面向对象多态与面向接口编程的体现而已,实际上types收到的是Type这个接口的子接口类型元素,
api文档上写着Type有四个子接口GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType。
其实下面再强制转换时,用instanceof判断一下是否是PrameterizedType会更好,更安全,这里张老师显然已经知道types[0]是什么,所以就免去了判断。
举个例子,这个会更好。- import java.lang.reflect.Field;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.Map;
- public class GenericTest
- {
- private Map<String, Integer> score;
- public static void main(String[] args) throws Exception
- {
- Class<GenericTest> clazz = GenericTest.class;
- Field f = clazz.getDeclaredField("score");
- // 直接使用getType()取出Field类型只对普通类型的Field有效
- Class<?> a = f.getType();
- // 下面将看到仅输出java.util.Map
- System.out.println("score的类型是:" + a);
- // 获得Field实例f的泛型类型
- Type gType = f.getGenericType();//注意这里要用顶层接口Type接收,因为方法定义就是这样的
- // 如果gType类型是ParameterizedType对象
- if (gType instanceof ParameterizedType)
- {
- // 强制类型转换
- ParameterizedType pType = (ParameterizedType) gType;
- // 获取原始类型
- Type rType = pType.getRawType();
- System.out.println("原始类型是:" + rType);
- // 取得泛型类型的泛型参数
- Type[] tArgs = pType.getActualTypeArguments();
- System.out.println("泛型类型是:");
- for (int i = 0; i < tArgs.length; i++)
- {
- System.out.println("第" + i + "个泛型类型是:" + tArgs[i]);
- }
- }
- else
- {
- System.out.println("获取泛型类型出错!");
- }
- }
- }
复制代码 |