啥是泛型?
泛型(generic)是指參數化類型的能力。可以定義帶泛型類型的類或方法,隨后編譯器會用具體的類型來代替它。
舉個栗子
上述代碼在編譯期沒有問題,但在運行期,將會報錯。就是因為List的add方法的參數為Object,所以如果在程序員在不知道List類型時,通過強轉獲值,這時就會報錯了。
使用泛型,將會解決這個問題。
如上兩個截圖所示,當聲明List所能裝載的類型后,List的add方法就只能裝載指定的類型,不然在編譯期便會報錯。
而且在獲值時,不再需要強制轉換。
使用泛型的優點
Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,提高代碼的重用率。
詳細的說:
- 類型安全。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變量的類型限制,編譯器可以在一個高得多的程度上驗證類型假設。沒有泛型,這些假設就只存在於程序員的頭腦中(或者如果幸運的話,還存在於代碼注釋中)。
- 消除強制類型轉換。泛型的一個附帶好處是,消除源代碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。
- 潛在的性能收益。 泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程序員會指定這些強制類型轉換)插入生成的字節碼中。但是更多類型信息可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。由於泛型的實現方式,支持泛型(幾乎)不需要 JVM 或類文件更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保類型安全而已。
使用泛型的一些規則與限制
- 泛型的類型參數只能是類類型(包括自定義類),不能是基本類型。
- 同一種泛型可以對應多個版本(因為參數類型是不確定的),不同版本的泛型類實例是不兼容的。
- 泛型的類型參數可以有多個。
- 泛型的參數類型可以使用extends語句,例如<T extends superclass>。習慣上成為“有界類型”。
- 泛型的參數類型還可以是通配符類型。例如Class<?> classType = Class.forName(Java.lang.String);
相關博客: