java 泛型解析

294 阅读1分钟

获取父类的泛型

public <T> void add(List<T> list) {
        //获取list父类型
        Type type = list.getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType) {//是否带有泛型
            ParameterizedType parameterizedType = (ParameterizedType) type;
            System.out.println("父类具体类型:" + parameterizedType);
            Type[] arguments = parameterizedType.getActualTypeArguments();
            for (Type argument : arguments) {
                System.out.println("泛型参数:" + argument);
                
                //对泛型参数再次判断  --- 可递归判断,这里只再判断一次
                if (argument instanceof ParameterizedType) {
                    ParameterizedType type1 = (ParameterizedType) argument;
                    for (Type typeArgument : type1.getActualTypeArguments()) {
                        System.out.println("子---泛型参数:" + typeArgument);
                    }
                }
            }
        } else {
            System.out.println("没有泛型");
        }
 }
 
 
   @Test
    public void test() {
    	//注意这里必须写匿名函数,否则获取的是ArrayList的父类
        //因为class只能获取父类的泛型参数
        add(new ArrayList<Map<String, Integer>>() {});
    }

输出结果

父类具体类型:java.util.ArrayList<java.util.Map<java.lang.String, java.lang.Integer>>
泛型参数:java.util.Map<java.lang.String, java.lang.Integer>
子---泛型参数:class java.lang.String
子---泛型参数:class java.lang.Integer
接口 具体类型:com.example.jetpark.GenericDemo$CallBack<java.util.List<java.lang.String>>
接口 具体类型:com.example.jetpark.GenericDemo$CallBack<java.util.List<java.lang.String>>
接口 泛型参数:java.util.List<java.lang.String>
接口  子---泛型参数:class java.lang.String

获取父接口的泛型

 public <T> void addInterface(CallBack<T> list) {
        //获取父类型
        Type[] types = list.getClass().getGenericInterfaces();
        for (Type type : types) {
            System.out.println("接口 具体类型:" + type);
            if (type instanceof ParameterizedType) {//是否具有泛型
                ParameterizedType parameterizedType = (ParameterizedType) type;
                System.out.println("接口 具体类型:" + parameterizedType);
                Type[] arguments = parameterizedType.getActualTypeArguments();
                for (Type argument : arguments) {
                    System.out.println("接口 泛型参数:" + argument);
                    if (argument instanceof ParameterizedType) {
                        ParameterizedType type1 = (ParameterizedType) argument;
                        for (Type typeArgument : type1.getActualTypeArguments()) {
                            System.out.println("接口  子---泛型参数:" + typeArgument);
                        }
                    }
                }
            } else {
                System.out.println("没有泛型");
            }
        }
    }

	//接口定义
    interface CallBack<T> {

    }
    
    @Test
    public void test() {
    	//同理,因为是接口,必须是子类
        addInterface(new CallBack<List<String>>(){});

    } 
    

输出结果

接口 具体类型:com.example.jetpark.GenericDemo$CallBack<java.util.List<java.lang.String>>
接口 具体类型:com.example.jetpark.GenericDemo$CallBack<java.util.List<java.lang.String>>
接口 泛型参数:java.util.List<java.lang.String>
接口  子---泛型参数:class java.lang.String

获取方法返回值泛型

	//测试方法
 	public List<Map<String, String>> testMethod() {
        return null;
    }

    @Test
    public void testM() throws Exception {
    	//反射获取testMethod方法
        Method testMethod = getClass().getDeclaredMethod("testMethod");
        //获取testMethod方法返回值类型
        Type returnType = testMethod.getGenericReturnType();
        System.out.println("返回值类型:" + returnType);
        if (returnType instanceof ParameterizedType) {
            Type[] arguments = ((ParameterizedType) returnType).getActualTypeArguments();
            for (Type argument : arguments) {
                System.out.println("泛型类型:" + argument);
                if (argument instanceof ParameterizedType) {
                    ParameterizedType type1 = (ParameterizedType) argument;
                    for (Type typeArgument : type1.getActualTypeArguments()) {
                        System.out.println("子---泛型类型:" + typeArgument);
                    }
                }
            }
        }
    }

输出结果

返回值类型:java.util.List<java.util.Map<java.lang.String, java.lang.String>>
泛型类型:java.util.Map<java.lang.String, java.lang.String>
子---泛型类型:class java.lang.String
子---泛型类型:class java.lang.String