为什么要写这一系列的博客呢?
因为在 Android 开发的过程中, 泛型,反射,注解这些知识进场会用到,几乎所有的框架至少都会用到上面的一两种知识,如 Gson 就用到泛型,反射,注解,Retrofit 也用到泛型,反射,注解 。
学好这些知识对我们非常重要,就像打地基一样,万丈高楼平地起。对我们阅读开源框架会有很大的帮助。
感兴趣的可以关注我哦,希望我们可以成为朋友,成长路上的忠实伙伴!
前言
错误可分为两种:编译时错误与运行时错误。编译时错误在编译时可以发现并排除,而运行时错误具有很大的不确定性,在程序运行时才能发现,造成的后果可能是灾难性的。
泛型的引入使得一部分错误可以提前到编译时期发现,极大地增强了代码的健壮性。但是我们知道 java 泛型在运行的时候是会进行泛型擦除的,那我们要怎样得到在编译时期泛型的信息呢?
java 为我们提供了 Type 接口,使用它,我们可以得到这些信息。
不知道什么是泛型擦除的同学可以看一下
类型擦除是指泛型在运行的时候会去除泛型的类型信息。java 中,泛型主要是在编译层次来实现的,在生成的字节码即 class 文件是不包括泛型的 类型信息的。
即 List , List ,List 虽然在编译时候是不同的,但是在编译完成后,在class 文件 中都只会把他们当作 List 来对待。
Type 接口简介
类 UML 图如下
简单来说:Type是所有类型的父接口, 如原始类型(raw types 对应 Class)、 参数化类型(parameterized types 对应 ParameterizedType)、 数组类型(array types 对应 GenericArrayType)、 类型变量(type variables 对应 TypeVariable )和基本(原生)类型(primitive types 对应 Class),。
子接口有 ParameterizedType, TypeVariable, GenericArrayType, WildcardType, 实现类有Class。
ParameterizedType (参数化类型)
官方文档的说明是这样的
ParameterizedType represents a parameterized type such as
Collection
需要注意的是,并不只是 Collection 才是 parameterized,任何类似于 ClassName 这样的类型都是 ParameterizedType ,比如下面的这些都是 parameterizedType.
Map<String, Person> map;
Set<String> set1;
Class<?> clz;
Holder<String> holder;
List<String> list;
static class Holder<V>{
}
而类似于这样的 ClassName 不是 ParameterizedType.
Set set;
List aList;
ParameterizedType 的几个主要方法
- Type[] getActualTypeArguments();
- Type getRawType();
- Type getOwnerType();<