J2SE JDK5.0 學習 一(泛型)

來源:互聯網
上載者:User

泛型的好處

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

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

Java
程式中的一種流行技術是定義這樣的集合,即它的元素或鍵是公用類型的,比如“String 列表”或者“String
到 String 的映射”。通過在變數聲明中捕獲這一附加的類型資訊,泛型允許編譯器實施這些附加的類型約束。類型錯誤現在就可以在編譯時間被捕獲了,而不是在運行時當作 ClassCastException 展示出來。將類型檢查從運行時挪到編譯時間有助於您更容易找到錯誤,並可提高程式的可靠性。

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

 

· 潛在的效能收益。 泛型為較大的最佳化帶來可能。在泛型的初始實現中,編譯器將強制類型轉換(沒有泛型的話,程式員會指定這些強制類型轉換)插入產生的位元組碼中。但是更多類型資訊可用於編譯器這一事實,為未來版本的 JVM 的最佳化帶來可能。

由於泛型的實現方式,支援泛型(幾乎)不需要 JVM 或類檔案更改。所有工作都在編譯器中完成,編譯器產生類似於沒有泛型(和強制類型轉換)時所寫的代碼,只是更能確保型別安全而已。

 

 

 

型別參數

在定義泛型類或聲明泛型類的變數時,使用角括弧來指定形式型別參數。形式型別參數與實際型別參數之間的關係類似於形式方法參數與實際方法參數之間的關係,只是型別參數表示類型,而不是表示值。泛型類中的型別參數幾乎可以用於任何可以使用類名的地方。除了異常類型、枚舉或匿名內部類以外,任何類都可以具有型別參數。

 

 

 

命名型別參數

推薦的命名規範是使用大寫的單個字母名稱作為型別參數。並反映了大多數泛型類將具有少量型別參數的假定。對於常見的泛型模式,推薦的名稱是:

· K ——
鍵,比如映射的鍵。

· V ——
值,比如 List 和 Set 的內容,或者 Map 中的值。

· E ——
異常類。

· T ——
泛型。

 

 

 

擦除

· Java
語言中的泛型基本上完全在編譯器中實現,由編譯器執行類型檢查和類型推斷,然後產生普通的非泛型的位元組碼。這種實現技術稱為擦除(erasure)(編譯器使用泛型型別資訊保證型別安全,然後在產生位元組碼之前將其清除)。

· 泛型基本上都是在 Java 編譯器中而不是運行庫中實現的,所以在產生位元組碼的時候,差不多所有關於泛型型別的類型資訊都被“擦掉”了。換句話說,編譯器產生的程式碼與您手工編寫的不用泛型、檢查程式的型別安全後進行強制類型轉換所得到的代碼基本相同。

· 當產生泛型類的位元組碼時,編譯器用型別參數的擦除 替換型別參數。對於無限制型別參數(<V>),它的擦除是 Object。對於上限型別參數(<K extends Comparable<K>>),它的擦除是其上限(在本例中是 Comparable)的擦除。對於具有多個限制的型別參數,使用其最左限制的擦除。

 

 

 

泛型方法

為什麼您選擇使用泛型方法,而不是將類型 T 添加到類定義呢?(至少)有兩種情況應該這樣做:

·  當泛型方法是靜態時,這種情況下不能使用類型別參數。

·  當 T 上的類型約束對於方法真正是局部的時,這意味著沒有在相同類的另一個 方法簽名中使用相同
類型 T 的約束。通過使得泛型方法的型別參數對於方法是局部的,可以簡化封閉類型的簽名。

 

 

 

向後相容

在 Java 語言中引入泛型的一個重要目標就是維護向後相容。儘管 JDK 5.0 的標準類庫中的許多類,比如集合架構,都已經泛型化了,但是使用集合類(比如 HashMap 和 ArrayList)的現有代碼將繼續不加修改地在 JDK 5.0 中工作。當然,沒有利用泛型的現有代碼將不會贏得泛型的型別安全好處。

相關閱讀材料:

Java 理論和實踐: 瞭解泛型

http://www-128.ibm.com/developerworks/cn/java/j-jtp01255.html

介紹JDK5.0中的泛型

http://www6.software.ibm.com/developerworks/cn/education/java/j-generics/tutorial/index.html

診斷 Java 代碼: 輕鬆掌握 Java 泛型

http://www.ibm.com/developerworks/cn/java/j-djc02113/index.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.