【J2SE】JAVA語法糖之-僞泛型

JAVA語法糖之-僞泛型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文件)代碼:spa

public static void main(String[] args)

  {

    List strList = new ArrayList();

    strList.add("generic test!");

    for (String str : strList)

      System.out.println(str);

  }

編譯後:返現泛型都不見了,泛型類型都變回原生類型code

緣由:1JVM沒有泛型這樣的概念,全部的泛型類型編譯事後所有變回原生類型,編譯器用擦除法實現泛型繼承

擦除規則:get

若是泛型類型的類型變量沒有限定(<T>),那麼咱們就用Object做爲原始類型;
    若是有限定(<T extends XClass>),咱們就XClass做爲原始類型;
    若是有多個限定(<T extends XClass1&XClass2>),咱們就用第一個邊界的類型變量XClass1類做爲原始類型;編譯器

所帶來的麻煩虛擬機

一、繼承泛型所帶來的多態麻煩it

編譯器使用橋方法來解決多態的衝突
    JVM會用參數類型和返回類型來肯定一個方法。 一旦編譯器經過某種方式本身編譯出方法簽名同樣的兩個方法(只能編譯器本身來創造這種奇蹟,咱們程序員卻不能人爲的編寫這種代碼)JVM仍是可以分清楚這些方法的,前提是須要返回類型不同。

二、方法衝突

三、沒有泛型數組

總結:泛型代碼與JVM
    ① 虛擬機中沒有泛型,只有普通類和方法。
    ② 在編譯階段,全部泛型類的類型參數都會被Object或者它們的限定邊界來替換。(類型擦除)
    ③ 在繼承泛型類型的時候,橋方法的合成是爲了不類型變量擦除所帶來的多態災難。

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

相關文章
相關標籤/搜索