java泛型程序设计——反射和泛型

来源:互联网 发布:会计金蝶软件 编辑:程序博客网 时间:2024/06/06 13:58

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 反射和泛型 的相关知识;


【1】反射和泛型相关

1.1)现在, Class类是泛型的, 如 String.class 实际上是一个 Class 类的对象(事实上, 是唯一的对象);
1.2)类型参数十分有用, 因为它允许Class 方法的返回类型更加具有针对性。

  • 1.2.1)下面的Class 中的方法就使用了类型参数:
    这里写图片描述

对上述语句的分析(Analysis):

  • A1)newInstance 方法: 它返回一个实例, 这个实例所属的类由默认的 构造器获得, 它的返回类型目前被声明为 T, 其类型与 Class 描述的类相同, 这样就免除了类型转换;
  • A2)如果给定的类型确实是T的一个子类型, cast 方法就会返回一个 现在声明为 类型T的对象, 否则, 抛出一个 BadCastException 异常;
  • A3)如果这个类不是 enum 类或类型T 的枚举值的数组, getEnumConstants 方法将返回 null;
  • A4)最后, getConstructor 与 getDeclaredConstructor 方法返回一个 Constructor 对象。 Construtor 类也已经变成 泛型, 以便 newInstance 方法有一个正确的 返回类型;

【2】使用 Class 参数进行类型匹配

2.1)有时, 匹配泛型方法中的Class 参数的类型变量很有使用价值。 看个荔枝(据说比较权威)

public static <T> Pair<T> makePair(Class<T> c) throws InstantiationException , IllegalAccessException{    return new Pair<>(c.newInstance (), c.newInstance());}
  • 2.1.1)如果调用 makePair(Employee.class)
  • 2.1.2)Employee.class 是类型 Class< Employee> 的一个对象。 makePair 方法的类型参数T 同 Employee 匹配, 并且编译器可以推断出这个方法将返回一个 Pair< Employee>;

【3】虚拟机中的泛型类型消息

3.1)java泛型的卓越特性之一是在虚拟机中 泛型类型的擦除;

  • 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.1)Class 类:描述具体类型;
  • 3.3.2)TypeVariable接口: 描述类型变量(如 T extends Comparable< ? super T>);
  • 3.3.3)WildcardType接口:描述通配符(如? super T);
  • 3.3.4)ParameterizedType 接口:描述泛型类或接口类型;(如 Comparable< ? super T>);
  • 3.3.5)GenericArrayType 接口: 描述泛型数组(如 T[]);
    这里写图片描述

3.4)看个荔枝:(使用 泛型反射API 打印出给定类的有关内容), 如果用Pair类运行, 将会得到如下报告:

Attention)源代码参见: https://github.com/pacosonTang/core-java-volume/blob/master/chapter12/GenericReflectionTest.java
这里写图片描述

0 0