#1 泛型与类型擦除 泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(Parametersized Type) 的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类,接口和方法的创建中, 分別称为泛型类、泛型接口和泛型方法。
在Java语言处于还没有出现泛型的版本时。只能通过Object 是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化。例如,在哈希表的存取中,JDK 1.5之前使用HashMap的get() 方法,返回值就是个0bject。由于Java语言里面所有的类型都维承于java.lang.Object 所以Object转型成任何对象都是有可能的。但是也因为有无限的可能性。就只有程序员和运行期的虚拟机才知道这个Objet到底是个什么类型的对象。在编译期间,编译器无法检查这个Object的强制转型是否成功。如果仅仅依赖程序员去保障这项操作的正确性,许多ClassCastException的风险就会转嫁到程予运行期之中。
Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type) ,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java来说AraylistAralist就是同一个类。所以泛型是Java语言的一颗语法糖Java称为类型擦除,基于这种方法实现的泛型称为伪泛型。




从Signature属性的出现我们还可以得出结论,所谓的擦除,仅仅是对方法的Code属性中的宇节码进行擦除,实际上元数据还是保留了泛型信息,这也是我们能通过反射取得参数化类型的根本依据。


