技术栈

2019-03-20——Java反射 GenericDeclar

2019-03-20  本文已影响0人  烟雨乱平生

该接口定义了哪些地方可以定义类型变量(泛型)

继承体系

GenericDeclaration.png

由继承体系可以看出我们定义泛型的类型变量只能在这三个地方——类、构造器和方法。

注意泛型变量的定义和使用是不同的,我们可以在Field上使用泛型变量,但不能在Field上声明泛型变量

该接口只声明了一个方法:

方法 说明
getTypeParameters() 返回实体上声明(定义)的所有的类型变量。
public class Info {
    public static void main(String[] args) {
        Arrays.stream(Info.class.getDeclaredMethods()).forEach(method->{
            if("method".equalsIgnoreCase(method.getName())){
                Parameter[] parameters = method.getParameters();
                System.out.println("获取参数的类型");
                for (Parameter parameter:parameters){
                    System.out.println(parameter.getType());
                }
                System.out.println("获取参数的参数化类型");
                for (Parameter parameter:parameters){
                    System.out.println(parameter.getParameterizedType());
                }
                System.out.println("是否是类型变量");
                for (Parameter parameter:parameters){
                    System.out.println(parameter.getParameterizedType() instanceof TypeVariable);
                }
                System.out.println("是否是参数化类型");
                for (Parameter parameter:parameters){
                    System.out.println(parameter.getParameterizedType() instanceof ParameterizedType);
                }
                TypeVariable<Method>[] variables = method.getTypeParameters();
                System.out.println("类型变量的名称");
                for (TypeVariable variable:variables){
                    System.out.println(variable.getName());
                }
            }
        });
    }

    <M,N> M method(M m,List<N> n){
        return m;
    }

}

输出结果是:

获取参数的类型
class java.lang.Object
interface java.util.List
获取参数的参数化类型
M
java.util.List<N>
是否是类型变量
true
false
是否是参数化类型
false
true
类型变量的名称
M
N
上一篇下一篇

猜你喜欢

热点阅读