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、 Java 程式中的一種流行技術是定義這樣的集合,即它的元素或鍵是公用類型的,比如“String 列表”或者“String到 String 的映射”。通過在變數聲明中捕獲這一附加的類型資訊,泛型允許編譯器實施這些附加的類型約束。類型錯誤現在就可以在編譯時間被捕獲了,而不是在運行時當作 ClassCastException展示出來。將類型檢查從運行時挪到編譯時間有助於您更容易找到錯誤,並可提高程式的可靠性。
3、消除強制類型轉換。 泛型的一個附帶好處是,消除原始碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。
程式碼範例:
class Notepad<K,V>{// 此處指定了兩個泛型型別private K key ;// 此變數的類型由外部決定private V value ;// 此變數的類型由外部決定public K getKey(){return this.key ;}public V getValue(){return this.value ;}public void setKey(K key){this.key = key ;}public void setValue(V value){this.value = value ;}};public class GenericsDemo09{public static void main(String args[]){Notepad<String,Integer> t = null ;// 定義兩個泛型型別的對象t = new Notepad<String,Integer>() ;// 裡面的key為String,value為Integert.setKey("湯姆") ;// 設定第一個內容t.setValue(20) ;// 設定第二個內容System.out.print("姓名;" + t.getKey()) ;// 取得資訊System.out.print(",年齡;" + t.getValue()) ;// 取得資訊}};