JAVA语法糖之-伪泛型
泛型即参数化类型
首先看一个泛型例子:
public static void main(String[] args) {
List<String> strList = new ArrayList<String>();
strList.add("generic test!");
for (String str : strList) {
System.out.println(str);
}
}
泛型擦出后(可以反编译class文件)代码:
public static void main(String[] args)
{
List strList = new ArrayList();
strList.add("generic test!");
for (String str : strList)
System.out.println(str);
}
编译后:返现泛型都不见了,泛型类型都变回原生类型
原因:1、JVM没有泛型这样的概念,所有的泛型类型编译过后全部变回原生类型,编译器用擦除法实现泛型
擦除规则:
如果泛型类型的类型变量没有限定(<T>),那么我们就用Object作为原始类型;
如果有限定(<T extends XClass>),我们就XClass作为原始类型;
如果有多个限定(<T extends XClass1&XClass2>),我们就用第一个边界的类型变量XClass1类作为原始类型;
所带来的麻烦
1、继承泛型所带来的多态麻烦
编译器使用桥方法来解决多态的冲突
JVM会用参数类型和返回类型来确定一个方法。 一旦编译器通过某种方式自己编译出方法签名一样的两个方法(只能编译器自己来创造这种奇迹,我们程序员却不能人为的编写这种代码)。JVM还是能够分清楚这些方法的,前提是需要返回类型不一样。
2、方法冲突
3、没有泛型数组
总结:泛型代码与JVM
① 虚拟机中没有泛型,只有普通类和方法。
② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)
③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。
文章转自:http://www.iteye.com/topic/549509
来源:oschina
链接:https://my.oschina.net/u/107039/blog/32688