1. 程式人生 > >Java中為什麼要使用泛型?

Java中為什麼要使用泛型?

       泛型(Generic type 或者 generics)是對 Java 語言的型別系統的一種擴充套件,以支援建立可以按型別進行引數化的類。可以把型別引數看作是使用引數化型別時指定的型別的一個佔位符,就像方法的形式引數是執行時傳遞的值的佔位符一樣。

        可以在集合框架(Collection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 新增任意類的物件,即使最常見的情況是在給定對映(map)中儲存某個特定型別(比如 String)的物件。
因為 Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結果強制型別轉換為期望的型別,如下面的程式碼所示:

Map m = new HashMap();
m.put(“key”, “blarg”);
String s = (String) m.get(“key”);

要讓程式通過編譯,必須將 get() 的結果強制型別轉換為 String,並且希望結果真的是一個 String。但是有可能某人已經在該對映中儲存了不是 String 的東西,這樣的話,上面的程式碼將會丟擲 ClassCastException。
理想情況下,您可能會得出這樣一個觀點,即 m 是一個 Map,它將 String 鍵對映到 String 值。這可以讓您消除程式碼中的強制型別轉換,同時獲得一個附加的型別檢查層,該檢查層可以防止有人將錯誤型別的鍵或值儲存在集合中。這就是泛型所做的工作。

泛型的好處

Java 語言中引入泛型是一個較大的功能增強。不僅語言、型別系統和編譯器有了較大的變化,以支援泛型,而且類庫也進行了大翻修,所以許多重要的類,比如集合框架,都已經成為泛型化的了。

這帶來了很多好處:

1,型別安全。 泛型的主要目標是提高 Java 程式的型別安全。通過知道使用泛型定義的變數的型別限制,編譯器可以在一個高得多的程度上驗證型別假設。沒有泛型,這些假設就只存在於程式設計師的頭腦中(或者如果幸運的話,還存在於程式碼註釋中)。

2,消除強制型別轉換。 泛型的一個附帶好處是,消除原始碼中的許多強制型別轉換。這使得程式碼更加可讀,並且減少了出錯機會。

3,潛在的效能收益。

泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制型別轉換(沒有泛型的話,程式設計師會指定這些強制型別轉換)插入生成的位元組碼中。但是更多型別資訊可用於編譯器這一事實,為未來版本的 JVM 的優化帶來可能。由於泛型的實現方式,支援泛型(幾乎)不需要 JVM 或類檔案更改。所有工作都在編譯器中完成,編譯器生成類似於沒有泛型(和強制型別轉換)時所寫的程式碼,只是更能確保型別安全而已。

 Java語言引入泛型的好處是安全簡單。泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高程式碼的重用率。

    泛型在使用中還有一些規則和限制:
    1、泛型的型別引數只能是類型別(包括自定義類),不能是簡單型別。
    2、同一種泛型可以對應多個版本(因為引數型別是不確定的),不同版本的泛型類例項是不相容的。
    3、泛型的型別引數可以有多個。
    4、泛型的引數型別可以使用extends語句,例如<T extends superclass>。習慣上成為“有界型別”。
    5、泛型的引數型別還可以是萬用字元型別。例如Class<?> classType = Class.forName(Java.lang.String);
    泛型還有介面、方法等等,內容很多,需要花費一番功夫才能理解掌握並熟練應用。在此給出我曾經瞭解泛型時候寫出的兩個例子(根據看的印象寫的),實現同樣的功能,一個使用了泛型,一個沒有使用,通過對比,可以很快學會泛型的應用,學會這個基本上學會了泛型70%的內容。