Java泛型的引入加强了参数类型的安全性,减少了类型的转换。Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉。Java泛型采用的是擦除法实现的伪泛型,泛型信息(类型变量、参数化类型)编译之后通通被除掉了。使用擦除法的好处就是实现简单、非常容易Backport,运行期也能够节省一些类型所占的内存空间。而擦除法的坏处就是,通过这种机制实现的泛型远不如真泛型灵活和强大。
泛型类型只有在静态类型检查期间才出现,在此之后,程序中的所有泛型类型都将被擦除,替换成它们非泛型上界。
举个例子,我们编写一个Test<T>泛型类:
但是,JVM不知道泛型是什么的。因此,Java使用擦拭法实现泛型,导致了
编译器把类型<T>视为Object;编译器根据<T>实现安全的强制转型。
使用泛型的时候,我们编写的代码也是编译器看到的代码。
所以,Java的泛型是由编译器在编译时实行的,编译器内部永远把所有类型T视为Object处理,但是,在需要转型的时候,编译器会根据T的类型自动为我们实行安全地强制转型。
Java 泛型的局限性:
例如:
public Test() { start = new T(); } //ERROR!
类型擦除将T改变成Object,调用非本意的new Object()。