什么代表反射TypeVariable接口

时间:2016-09-03 16:32:13

标签: java reflection

我试图阅读并理解java反射机制使用的不同接口和类,但我不明白真正代表实现TypeVariable接口的类的实例是什么?

以下来自official documentation的引文实际上含糊不清:

  

如果类型变量t由类型(即类,接口或注释类型)T引用,并且T由第n个封闭类T(参见JLS 8.1.2)声明,那么创建t需要对于i = 0到n,包括类的T的第i个分辨率(见JVMS 5)。创建类型变量不得导致其边界的创建。

任何人都可以给我一个小例子,清楚地解释上段的意思吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

它表示方法,构造函数或类型声明的类型变量,即以下代码段中的T

public static <T> void f(){}

class A<T> {}

interface I<T> {}

class B {
    <T>B() {
    }
}

请注意,这与类型用途不同,例如Integer不是以下代码段中的类型变量:

List<Integer> list = Arrays.<Integer>asList(null);

类型变量的使用不代表:

public static <T> void h(T t) {}
                         ^
                     Not a TypeVariable

以下是标准API中类的使用列表:https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/class-use/TypeVariable.html

ParametrizedType的区别:

TypeVariable是指类型变量的声明,ParametrizedType是对这种类型的使用。

示例:

public class ReflectTest {

    public Collection<String> c;

    public static void main(String[] args) throws NoSuchFieldException {
        System.out.println(Collection.class.getTypeParameters()[0]); // E
        System.out.println(Collection.class.getTypeParameters()[0] instanceof TypeVariable); // true
        System.out.println(Collection.class.getTypeParameters()[0] instanceof ParameterizedType); // false
        Field field = ReflectTest.class.getField("c");
        System.out.println(field.getGenericType()); // java.util.Collection<java.lang.String>
        System.out.println(field.getGenericType() instanceof TypeVariable); // false
        System.out.println(field.getGenericType() instanceof ParameterizedType); // true
    }

}