1.java为什么需要泛型?
a.使用泛型,可以编写模板代码来适应任意类型,减少重复代码
b.使用泛型,不必对类型进行强制转换,方便且减少出错机会
2.什么是泛型擦除?
Java的泛型被称作是伪泛型,仅于编译时类型检查,在运行时擦除类型信息.
之所以这样做,是为了向下兼容.
3.泛型擦除后retrofit是怎么获取类型的?
先看下retrofit的代码片段
static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {
...
Type returnType = method.getGenericReturnType();
...
}
public Type getGenericReturnType() {
// 根据 Signature 信息 获取 泛型类型
if (getGenericSignature() != null) {
return getGenericInfo().getReturnType();
} else {
return getReturnType();
}
}
可以看出,retrofit是通过getGenericReturnType来获取类型信息的.
jdk的Class、Method、Field类提供了一系列获取泛型类型的相关方法.
以Method为例,getGenericReturnType获取带泛型信息的返回类型
getGenericParameterTypes获取带泛型信息的参数类型
有人会问:泛型的信息不是被擦除了吗?
是被擦除了,但是某些(声明侧的泛型,接下来解释)泛型信息会被class文件以Signature的形式保
留在Class文件的Constant pool中.
泛型分为声明侧泛型和使用测泛型
声明侧泛型:(会被记录在class文件中)
a.泛型类,或泛型接口的声明
b.带有泛型参数的方法
c.带有泛型参数的成员变量
使用侧泛型:(不会被记录)
a.方法的局部变量的泛型,方法调用时传入的变量
总结: retrofit就是利用声明侧泛型的特性获取信息的