随笔博文

Type及其子接口的来历

2022-12-06 12:52:30 michael007js 59

泛型出现之前

没有泛型的时候,只有所谓的原始类型。此时,所有的原始类型都通过字节码文件类Class类进行抽象。Class类的一个具体对象就代表一个指定的原始类型。

泛型出现之后

泛型出现之后,扩充了数据类型。从只有原始类型扩充了参数化类型(ParameterizedType)、类型变量类型(TypeVariable)、泛型限定的参数化类型 (含通配符+通配符限定表达式)(WildcardType)、泛型数组类型(GenericArrayType)。

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

产生泛型擦除的原因

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

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

因此,与泛型有关的泛型实例(ParameterizedType)、类型变量(TypeVariable)、泛型参数表达式 (含通配符+通配符限定表达式)(WildcardType)、泛型数组(GenericArrayType)这些类型全部被打回原形,在字节码文件中全部都是泛型被擦除后的原始类型,并不存在和自身类型一致的字节码文件。所以和泛型相关的新扩充进来的类型不能被统一到Class类中。

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

为了通过反射操作这些类型以迎合实际开发的需要,Java就新增了ParameterizedType,GenericArrayType,TypeVariable 和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型。

Type的引入:统一与泛型有关的类型和原始类型Class

为了程序的扩展性,最终引入了Type接口作为Class,ParameterizedType,GenericArrayType,ypeVariable和WildcardType这几种类型的总的父接口。这样实现了Type类型参数可以接受以上五种子类的实参,而以上五种类型的返回值可以用Type类型的变量来接收。

从上面看到,Type的出现仅仅起到了通过多态来达到程序扩展性提高的作用,没有其他的作用。因此Type接口的源码中没有任何方法。


首页
关于博主
我的博客
搜索