首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

輕鬆掌握 Java 泛型(一):從向下轉型困境到泛型類型的曙光

     編輯:Java 相關知識

J2SE 1.5(代號 Tiger,預計 2003 年底發布)將帶來 Java 程式設計迄今最大進展,最顯著變化是泛型類型(JSR-14 原型編譯器已免費提供下載)。本系列首篇介紹泛型類型何物、為何需要、Tiger 為支援它們做了哪些調整。

向下轉型:錯誤溫床

Java 最易引發錯誤因素之一是不斷向下轉型。每次轉型皆為潛在 ClassCastException,應盡量避免,但在 Java 中常無法避免,即使設計優良。主因:專用方式使用類別,限制方法回傳參數可能的運行時型別,但型別系統無法表達此限制。

例:Hashtable 的 put/get 簽名僅接受/回傳 Object。即使明知只放 String,取出時仍須強制轉型:

Hashtable h = new Hashtable();
h.put(new Integer(0), "value");
String s = (String)h.get(new Integer(0)); // 必須轉型

轉型不僅使代碼冗長,更降低靜態型別檢查價值(每個轉型皆為忽略檢查的偽指令)。如何擴展型別系統避免繞過它?

泛型類型:解決之道

泛型類型可視為型別「函數」,透過型別變量參數化,依上下文實例化。定義 Hashtable<Key, Value>,參數可像普通型別用於類別主體:

class Hashtable<Key, Value> {
  Value put(Key k, Value v) { ... }
  Value get(Key k) { ... }
}

實例化時傳遞具體型別:Hashtable<Integer, String> h = new Hashtable<Integer, String>(); 取值無需轉型:String s = h.get(new Integer(0)); Tiger 提供所有集合類泛型版本,與舊代碼無縫協作(下期詳述)。

基本型別限制

型別變量必須用引用型別實例化,基本型別無效。無法建立 int → String 映射,須手動裝箱 Integer。期待自動裝箱/拆箱(類似 C#)納入未來版本。

受限泛型

有時需限制型別參數範圍。例:ScrollPane<MyPane extends Pane> 確保 MyPane 為 Pane 子類。優勢:

  1. 增加靜態檢查,保證實例化符合界限。
  2. 可放心調用界限中定義的方法(預設界限 Object 僅能調用 Object 方法)。

多態方法

方法層面參數化同樣有用。多態方法以型別參數前綴宣告:

class Utilities {
  <T extends Object> public static List<T> make(T first) {
    return new List<T>(first);
  }
}

Tiger 採用型別推斷,自動從參數推導型別引數:Utilities.make(new Integer(0)) 推斷為 List<Integer>,大幅簡化調用。

結語

泛型類型大幅增強靜態型別系統威力,學習簡單但有陷阱。後續文章將深入探討 Tiger 泛型具體表現、陷阱規避,及期盼納入 Java 平台的擴展工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved