美文网首页Java 杂谈
CoreJava笔记 - 范型程序设计(5)

CoreJava笔记 - 范型程序设计(5)

作者: 杀死BL | 来源:发表于2018-07-26 10:08 被阅读2次

    反射与范型

    由于类型擦除,反射无法得到关于范型类型参数的信息。

    1. 范型的Class类

      在Java的反射库中,Class类是范型的,例如String.class将会得到一个Class<String>。有了这些类型信息,则可以在调用反射方法时,进行更少的类型转换。

    2. 使用Class<T>进行参数匹配
      编译器很聪明,它可以从Class<T>中抽取类型信息,推测一些确定的类型。

      public static <T> Pair<T> makePair(Class<T> c) throws InstantiationException,
      IllegalAccessException {
          return new Pair<>(c.newInstance(), c.newInstance);
      }
      

      调用makePair(Employee.class),编译器可以推测出返回值为Pair<Employee>

    3. 虚拟机中的范型信息
      虽然范型信息在虚拟机中被擦除了,但是反射仍然可以得到一些范型信息。虚拟机中的PairRAW TYPE类知道自己源于一个Pair<T>,但是它不知道T是什么,是String,还是Employee
      范型方法public static <T extends Comparable<? super T>> T min(T[] a)
      类型擦除后,方法变为public static Comparable min(Comparable[] a)
      通过反射,仍然可以得到部分范型信息:

      • 这个方法有一个叫做T的类型参数。
      • 这个类型参数有一个子类型的限定(extends),子类型又是一个范型类型。
      • 限定类型有一个通配符参数。
      • 通配符有个超类型限定。
      • 方法参数有个是范型数组。

      相关的类和方法:

      • Class.getTypeParameters()
      • Class.getGenericSuperClass()
      • Class.getGenericInterfaces()
      • Method.getTypeParameters()
      • Method.getGenericReturnType()
      • Method.getGenericParameterTypes()
      • TypeVariable.getName()
      • TypeVariable.getBounds()
      • WildcardType.getUpperBounds()
      • WildcardType.getLowerBounds()
      • ParameterizedType.getRawType()
      • ParameterizedType.getActualTypeArguments()
      • ParameterizedType.getOwnerType()
      • GenericArrayType.getGenericComponentType()

    相关文章

      网友评论

        本文标题:CoreJava笔记 - 范型程序设计(5)

        本文链接:https://www.haomeiwen.com/subject/erbvmftx.html