【J2SE】JAVA语法糖之-伪泛型

为什么80%的码农都做不了架构师?>>>   hot3.png

JAVA语法糖之-伪泛型

泛型即参数化类型

首先看一个泛型例子:

 

public static void main(String[] args) {
		List strList = new ArrayList();
		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);

  }

编译后:返现泛型都不见了,泛型类型都变回原生类型

原因:1JVM没有泛型这样的概念,所有的泛型类型编译过后全部变回原生类型,编译器用擦除法实现泛型

擦除规则:

如果泛型类型的类型变量没有限定(),那么我们就用Object作为原始类型;
    如果有限定(),我们就XClass作为原始类型;
    如果有多个限定(),我们就用第一个边界的类型变量XClass1类作为原始类型;

所带来的麻烦

1、继承泛型所带来的多态麻烦

编译器使用桥方法来解决多态的冲突
    JVM会用参数类型和返回类型来确定一个方法。 一旦编译器通过某种方式自己编译出方法签名一样的两个方法(只能编译器自己来创造这种奇迹,我们程序员却不能人为的编写这种代码)JVM还是能够分清楚这些方法的,前提是需要返回类型不一样。

2、方法冲突

3、没有泛型数组

总结:泛型代码与JVM
    ① 虚拟机中没有泛型,只有普通类和方法。
    ② 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)
    ③ 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。

文章转自:http://www.iteye.com/topic/549509

转载于:https://my.oschina.net/iblike/blog/32688

你可能感兴趣的:(【J2SE】JAVA语法糖之-伪泛型)