idc网站模版,搜索引擎优化的常用方法,WordPress 会员空间插件,乡下自家院子设计图片【0】README
0.1#xff09; 本文描述源代码均 转自 core java volume 1#xff0c; 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识#xff1b; 【1】反射和泛型相关
1.1#xff09;现在#xff0c; Class类是泛型的#xff0c; 如 String.class 实际上是一个 C…【0】README
0.1 本文描述源代码均 转自 core java volume 1 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识 【1】反射和泛型相关
1.1现在 Class类是泛型的 如 String.class 实际上是一个 Class 类的对象事实上 是唯一的对象 1.2类型参数十分有用 因为它允许Class 方法的返回类型更加具有针对性。
1.2.1下面的Class 中的方法就使用了类型参数
对上述语句的分析Analysis
A1newInstance 方法 它返回一个实例 这个实例所属的类由默认的 构造器获得 它的返回类型目前被声明为 T 其类型与 Class 描述的类相同 这样就免除了类型转换A2如果给定的类型确实是T的一个子类型 cast 方法就会返回一个 现在声明为 类型T的对象 否则 抛出一个 BadCastException 异常A3如果这个类不是 enum 类或类型T 的枚举值的数组 getEnumConstants 方法将返回 nullA4最后 getConstructor 与 getDeclaredConstructor 方法返回一个 Constructor 对象。 Construtor 类也已经变成 泛型 以便 newInstance 方法有一个正确的 返回类型 【2】使用 Class 参数进行类型匹配
2.1有时 匹配泛型方法中的Class 参数的类型变量很有使用价值。 看个荔枝据说比较权威
public static T PairT makePair(ClassT c) throws InstantiationException , IllegalAccessException
{return new Pair(c.newInstance (), c.newInstance());
}
2.1.1如果调用 makePair(Employee.class) 2.1.2Employee.class 是类型 Class Employee 的一个对象。 makePair 方法的类型参数T 同 Employee 匹配 并且编译器可以推断出这个方法将返回一个 Pair Employee; 【3】虚拟机中的泛型类型消息
3.1java泛型的卓越特性之一是在虚拟机中 泛型类型的擦除
3.1.1如 原始的 Pair类知道源于泛型类 Pair T 即使一个 Pair类型的对象无法区分是由 Pair String 构造的还是由 Pair Employee 构造的3.1.2类似的 看一下方法
public static Comparable min(Comparable[] a) 这是一个方法的擦除 public static T extends Comparable? super T T min(T[] a)
3.2可以用反射API类确定
3.2.1这个泛型方法有一个叫做T的类型参数3.2.2这个类型参数有一个子类型限定 其自身又是一个泛型类型3.2.3这个限定类型有一个通配符参数3.2.4这个通配符参数有一个 超类型限定3.2.5这个泛型方法有一个泛型数组参数
Conclusion 一句话 需要重新构造实现者声明的泛型类以及方法中的所有内容。 但是 不会知道对于特定的对象或方法调用如何解释类型参数 3.3 为了表达泛型类型声明 java SE 5.0 在 java.lang.reflect 包中提供了一个新的接口 Type 该接口有如下子类
3.3.1Class 类描述具体类型3.3.2TypeVariable接口 描述类型变量如 T extends Comparable ? super T3.3.3WildcardType接口描述通配符如? super T3.3.4ParameterizedType 接口描述泛型类或接口类型如 Comparable ? super T3.3.5GenericArrayType 接口 描述泛型数组如 T[]
3.4看个荔枝使用 泛型反射API 打印出给定类的有关内容 如果用Pair类运行 将会得到如下报告
Attention源代码参见 https://github.com/pacosonTang/core-java-volume/blob/master/chapter12/GenericReflectionTest.java