java Type 详解

本文详细探讨了Java中的Type接口及其子接口,包括ParameterizedType、TypeVariable、GenericArrayType和WildcardType,旨在理解泛型擦除后的类型信息获取。通过实例展示了如何使用这些接口来获取泛型信息,对于理解和阅读Java框架源码非常有帮助。
摘要由CSDN通过智能技术生成

为什么要写这一系列的博客呢?

因为在 Android 开发的过程中, 泛型,反射,注解这些知识进场会用到,几乎所有的框架至少都会用到上面的一两种知识,如 Gson 就用到泛型,反射,注解,Retrofit 也用到泛型,反射,注解 。

学好这些知识对我们非常重要,就像打地基一样,万丈高楼平地起。对我们阅读开源框架会有很大的帮助

java Type 详解

java 反射机制详解

注解使用入门(一)

Android 自定义编译时注解1 - 简单的例子

Android 编译时注解 —— 语法详解

带你读懂 ButterKnife 的源码

感兴趣的可以关注我哦,希望我们可以成为朋友,成长路上的忠实伙伴!

前言

错误可分为两种:编译时错误与运行时错误。编译时错误在编译时可以发现并排除,而运行时错误具有很大的不确定性,在程序运行时才能发现,造成的后果可能是灾难性的。

泛型的引入使得一部分错误可以提前到编译时期发现,极大地增强了代码的健壮性。但是我们知道 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();

Type[] getActualTypeArguments(); 返回 这个 Type 类型的参数的实际类型数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值