JAVA-初步认识-常用对象API(集合框架-泛型-擦除补偿)

一.

接下来说一个泛型的原理部分,上一节交代了泛型的定义和使用了。泛型提供了安全性,java分两个部分,编译和运行,提高了编译的安全性,正因为编译时检查完了,运行时才没事。它是用在编译时期的安全技术。

泛型是编译时期的技术,给编译器用的,

加尖括号是要在编译时期用的,我要在源代码里把类型写好,编译器开始检查对不对。一检查对了,就通过了。

运行的时候,要靠虚拟机启动类装载器,专门读取类文件解析类文件,并把类文件加载进内存的程序。1.4版本,1.5版本都用的这个加载器。

只在编译的时候,将类型进行检查。如果检查完是安全的,没有错误的,运行就可以把这个泛型去掉了,因为,类型就统一了。我们还想要以前的类加载器

进行加载解析,并进内存。以前加载器没见过泛型。

有一个问题,取出来的时候不加强转了,你还知道取出来的是什么么?编译器只做检查,检查完,最终这个类型被擦掉,所以这个里面和以前一样还是object,(这里应该是指,add方法中加入的元素变成了object类型了),那就意味着它们提升了。同时,下面还不能做强转,取出来就能用,这是为什么呢?

这里做了另外一种动作,叫做补偿。编译结束后,要是完全不告诉类装载器不合适,用了泛型补偿机制告诉类加载器,都检测完了,就编写一个补偿程序。在类装载器已有的基础上,来了以后,我根据你指定的好的元素类型,真正运行的时候就要碰到这个元素了,根据你的元素获取其类型,再对你进行一次转换就行了。我们不用做,它来做。有人就问了,怎么得到元素类型呢?任何一个对象都有gerclass方法,可以拿到任何一个对象所属的类文件,字节码文件。这字节码文件说白了,就是String,也就将这个元素类型转化回来了。它会对其进行判断,并进行转换。

这就是泛型补偿机制,它在帮我们做转换。有人说,万一元素类型不一样呢?这不同类型的元素根本就进不去,何谈不一样。只要是统一的,就可以拿到元素类型对其进行转换了,剩下的部分不用再做了。

以后升级可能都要跟着改变,视频中讲解的时候是5,现在都是9了。泛型指不定就直接被类装载了。我只要把泛型的解析方式解析完,我随时可以获取到一个类中的泛型是什么。完全可以做,由我来做不是更好么。

原文地址:https://www.cnblogs.com/wsw-bk/p/8335999.html