什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的
1. 泛型的定義和意義
1.1 什么叫泛型?
泛型,顧名思義就是廣泛的類型,專業術語為“參數化類型”;當我們創建對象時沒指定類型,任何引用類型都可以使用,兼容多種數據類型。如果是基本類型,會自動裝箱轉為對應的包裝類,如下圖。
1.2 但是指定類型后,只能使用特定類型,如下圖。
1.3 為什么要使用泛型?
因為對于一些工具類來說,編寫時是不知道使用者到時用在哪些類上,所以為了能夠自適應類型,就得使用泛型這種機制。
2. 泛型的使用和工作原理
2.1 泛型類的定義及使用
2.2 泛型方法的定義及使用
2.3 工作原理
事實上,泛型只在編譯階段有作用,編譯器檢驗泛型信息之后,如果沒有限定類型,那么泛型的相應使用處會替換為Object類型。如果限定了類型,那么在使用時會先進行類型檢查,然后會進行類型擦除。源代碼和字節碼文件反編譯分析如下圖。
? ??
? ??
通過上面的代碼分析,我們實現了泛型擦除并且知道泛型擦除是什么。泛型擦除就是在擦除前,如果指定了類型,那么使用時會進行類型檢查,然后在編譯后進行泛型擦除,字節碼中已經不存在泛型,泛型相應使用處都使用Object替代。
那么類型擦除的作用是什么呢? 是為了確保和沒有泛型特性的JDK5版本的類庫兼容。
3. 限定通配符和非限定通配符?
3.1 限定通配符
限定通配符有兩種:一種是<? extends T>,通過這種確保泛型是T的子類,可以是T本身,也可以是子類的子類,這樣的話,T的多個實現類都可以作為泛型對象;另一種是<? super T>,通過確保類型必須是T的父類來設定類型的下界。
3.2 非限定通配符
非限定通配符即<?>,可以是任何類型,但是它不可以定義類和泛型方法,一般用作參數,如下圖。
附錄:代碼
public class GenericTest {public static void main(String[] args) {GenericClass<String> genericClass = new GenericClass<String>();String s = "abc";genericClass.test(s);testGe(s);}public static <T> T testGe(T t){if(t instanceof String){System.out.println("String: " + t);}else if(t instanceof Integer){System.out.println("Integer: " + ((Integer)t + 1));}return t;} }class GenericClass<T> {T test(T t){System.out.println("泛型類測試");return t;} }總結
以上是生活随笔為你收集整理的什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在有N元钱,两块钱一瓶,或者直接给你N
- 下一篇: Java,Math类中的ceil、flo