通常,程序员不必知道Java编译器是如何把源代码译成目标代码的,但是对于泛型的情况,对此过程有个大致了解是很重要的,因为他能够解释泛型特性的工作原理,以及为什么有些时候泛型的行为出人意料.为此,需要简要讨论一下泛型在Java中是如何实现的.
泛型加入Java中受到的一个主要的制约就是需要与以前的版本的Java兼容.简单的讲,就是泛型代码必须和已有的非泛型代码兼容.因此任何对Java语言的语法或对JVM的修改都要避免破坏已有的代码.Java在实现泛型的同时又能够满足兼容性约束是通过使用擦除特性(erasure)实现的.
擦除特性的工作原理大致如下:当Java代码编译时,所有的泛型类型信息都将被删除(擦除).这意味着使用类型形参的约束类型来替换类型形参,如果没有显式的指定约束类型,则约束类型为Object,然后应用适合的强制类型转换(由类型实参确定)来与类型实参指定的类型保持兼容.编译器还强制这种类型兼容性.这种方法对于泛型意味着在运行时不存在类型形参,他们只是一种源代码机制.