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
緣由:1、JVM沒有泛型這樣的概念,全部的泛型類型編譯事後所有變回原生類型,編譯器用擦除法實現泛型繼承
擦除規則:get
若是泛型類型的類型變量沒有限定(<T>),那麼咱們就用Object做爲原始類型;
若是有限定(<T extends XClass>),咱們就XClass做爲原始類型;
若是有多個限定(<T extends XClass1&XClass2>),咱們就用第一個邊界的類型變量XClass1類做爲原始類型;編譯器
所帶來的麻煩虛擬機
一、繼承泛型所帶來的多態麻煩it
編譯器使用橋方法來解決多態的衝突
JVM會用參數類型和返回類型來肯定一個方法。 一旦編譯器經過某種方式本身編譯出方法簽名同樣的兩個方法(只能編譯器本身來創造這種奇蹟,咱們程序員卻不能人爲的編寫這種代碼)。JVM仍是可以分清楚這些方法的,前提是須要返回類型不同。
二、方法衝突
三、沒有泛型數組
總結:泛型代碼與JVM
① 虛擬機中沒有泛型,只有普通類和方法。
② 在編譯階段,全部泛型類的類型參數都會被Object或者它們的限定邊界來替換。(類型擦除)
③ 在繼承泛型類型的時候,橋方法的合成是爲了不類型變量擦除所帶來的多態災難。
文章轉自:http://www.iteye.com/topic/549509