我试图阅读并理解java反射机制使用的不同接口和类,但我不明白真正代表实现TypeVariable
接口的类的实例是什么?
以下来自official documentation的引文实际上含糊不清:
如果类型变量t由类型(即类,接口或注释类型)T引用,并且T由第n个封闭类T(参见JLS 8.1.2)声明,那么创建t需要对于i = 0到n,包括类的T的第i个分辨率(见JVMS 5)。创建类型变量不得导致其边界的创建。
任何人都可以给我一个小例子,清楚地解释上段的意思吗?
提前致谢。
答案 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
}
}