泛型是JDK 1.5的一項新增特性,它的本質是參數化類型(ParametersizedType)的應用,也就是說所操作的數據類型被指定為一個參數(是不是像lambda表達式差不多的用義,用函數作為一個方法的參數)。這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口和泛型方法。
具體來說,我們先通過對比下代碼,來進一步體會泛型的好處
先看看沒有支持泛型之前的代碼


由以上兩個例子可以看出:
引入泛型後,代碼在前端編譯的時候會做檢查,不會像1.5的代碼示範一樣,直到程序運行期才提示異常。通過現代idea自動編譯功能,由此可以大大提高我們的編程效率
但是有關java的泛型有一些值得思考的問題:


代碼示範:用兩個不同List類型參數重載getName方法編譯報錯,why?
以上現象是因為在編譯時泛型擦除造成的,什麼? 泛型擦除又是什麼鬼?
我們可以通過字節碼來分析這個問題


然後用jd-gui工具反編譯回java代碼

通過對比可以看出,反編譯的代碼跟我們之前寫的代碼不一致了,代碼風格也用回1.5之前的強制類型轉換了,即高版本支持某些語法糖的編程風格編譯之後轉化為低版本代碼風格了(解語法糖)
現在我們可以知道為什麼用兩個不同List類型參數重載getName方法會編譯報錯了:
兩個不同List類型參數,在編譯的時候都轉為List<Object>了,然後就不符合重載的定義了
所以有個哲學上的問題:
List<Integer>
List<String>
其實這兩個類型不是真正意義上的類型,他們在某種意義上還是一個List類型,只是套了層修飾,這種表面上的修飾作用很有利於編程人員,過了編譯期,這種修飾就沒有意義了,當然,為了運行期反射來獲取這種修飾符號,在編譯成字節碼時,增加了一些屬性來記錄這個具體的類型,解決伴隨泛型而來的參數類型的識別問題,如如Signature、LocalVariableTypeTable

所以有個說法是:java實現的泛型,其實不是真正意義上的泛型,是偽泛型