概念
- Java通过泛型擦除机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除
- 为了通过反射操作这些类型,Java新增了
ParameterizedType,GenericArrayType,TypeVariable和WildcardType
几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型
ParameterizedType
:表示一种参数化类型,比如Collection<String>
GenericArrayType
:表示一种元素类型是参数化类型或者类型变量的数组类型
TypeVariable
:是各种类型变量的公共父接口
WildcardType
:代表一种通配符类型表达式
public class Test11 {
public static void main(String[] args) throws NoSuchMethodException {
System.out.println("测试泛型的参数类型==================================================");
Method method = Test11.class.getMethod("test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes(); //获取泛型的参数类型
for (Type genericParameterType:genericParameterTypes) {
System.out.println("#"+genericParameterType);
if(genericParameterType instanceof ParameterizedType){ //该泛型是否是参数化类型
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments(); //获取真实参数信息
for (Type actualType : actualTypeArguments) {
System.out.println(actualType);
}
}
}
System.out.println("测试泛型的返回值类型==================================================");
method = Test11.class.getMethod("test02", null);
Type genericReturnType = method.getGenericReturnType();
if(genericReturnType instanceof ParameterizedType){ //该泛型是否是参数化类型
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); //获取真实参数信息
for (Type actualType : actualTypeArguments) {
System.out.println(actualType);
}
}
}
public static void test01(Map<String,User> map, List<User> list){
System.out.println("test01");
}
public Map<String,User> test02(){
System.out.println("test02");
return null;
}
}
评论