java泛型擦除,如何获取泛型信息(retrofit)

本文介绍了Java泛型的作用,如减少重复代码和避免类型转换错误,以及Java泛型的擦除机制,这是为了保持与早期版本的兼容性。在运行时,虽然泛型信息被擦除,但Retrofit通过获取方法的Signature信息来在声明侧获取泛型类型。Java的Class、Method和Field类提供了获取泛型类型的方法,使得Retrofit等库能在运行时解析泛型信息。
摘要由CSDN通过智能技术生成

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就是利用声明侧泛型的特性获取信息的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值