JSON 序列化与反序列化(-)泛型 及 java.lang.reflect.Type

Type及其子接口的来历

泛型出现以前的类型

没有泛型的时候,只有原始类型。此时,全部的原始类型都经过字节码文件类Class类进行抽象。Class类的一个具体对象就表明一个指定的原始类型。html

泛型出现以后的类型

泛型出现以后,扩充了数据类型。从只有原始类型扩充了参数化类型、类型变量类型、限定符类型 、泛型数组类型。java

与泛型有关的类型不能和原始类型统一到Class的缘由

  • 产生泛型擦除的缘由

原始类型和新产生的类型都应该统一成各自的字节码文件类型对象。可是因为泛型不是最初Java中的成分。若是真的加入了泛型,涉及到JVM指令集的修改,这是很是致命的。数组

  • Java中如何引入泛型

为了使用泛型又不真正引入泛型,Java采用泛型擦除机制来引入泛型。Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换的麻烦。可是,一旦编译完成,全部的和泛型有关的类型所有擦除。安全

  • Class不能表达与泛型有关的类型

所以,与泛型有关的参数化类型、类型变量类型、限定符类型 、泛型数组类型这些类型编译后所有被打回原形,在字节码文件中所有都是泛型被擦除后的原始类型,并不存在和自身类型对应的字节码文件。因此和泛型相关的新扩充进来的类型不能被统一到Class类中。url

  • 与泛型有关的类型在Java中的表示

为了经过反射操做这些类型以迎合实际开发的须要,Java就新增了ParameterizedType, TypeVariable<D>, GenericArrayType, WildcardType几种类型来表明不能被归一到Class类中的类型可是又和原始类型齐名的类型。spa

  • 引入Type的缘由

为了程序的扩展性,最终引入了Type接口做为Class和ParameterizedType, TypeVariable<D>, GenericArrayType, WildcardType这几种类型的总的父接口。这样能够用Type类型的参数来接受以上五种子类的实参或者返回值类型就是Type类型的参数。统一了与泛型有关的类型和原始类型Class.net

  • Type接口中没有方法的缘由

从上面看到,Type的出现仅仅起到了经过多态来达到程序扩展性提升的做用,没有其余的做用。所以Type接口的源码中没有任何方法。code

 

public static void getTypeParameters(){ List<Integer> list = new ArrayList<Integer>(); Map<Integer, String> map = new HashMap<Integer, String>(); System.out.println(Arrays.toString(list.getClass().getTypeParameters())); //[E] System.out.println(Arrays.toString(map.getClass().getTypeParameters())); //[K, V] } /** * 其中最关键的差异是本节的变量声明多了一对大括号 * 变量声明实际上是建立了一个匿名内部类, 这个类是 HashMap 的子类 * * Java 引入泛型擦除的缘由是避免由于引入泛型而致使运行时建立没必要要的类。那咱们其实就能够经过定义类的方式,在 * 类信息中保留泛型信息,从而在运行时得到这些泛型信息 * * 简而言之,Java 的泛型擦除是有范围的,即类定义中的泛型是不会被擦除的 * */
    public static void getActualTypeArguments(){ // Map<String, Integer> map = new HashMap<String, Integer>() ;
        Map<String, Integer> map = new HashMap<String, Integer>() {}; Type type = map.getClass().getGenericSuperclass(); ParameterizedType parameterizedType = ParameterizedType.class.cast(type); for (Type typeArgument : parameterizedType.getActualTypeArguments()) { System.out.println(typeArgument.getTypeName()); //java.lang.String, java.lang.Integer } }

 

 

参考:htm

Java的Type详解对象

相关文章
相关标签/搜索