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

JDK 5.0 泛型深度解析:從基礎語法到進階通配符與方法

     編輯:Java 相關知識

核心概念:參數化類型

泛型本質是「類型參數化」,將具體類型延遲到實例化時指定,實現程式碼復用與型別安全的雙贏。

class Pair<K, V> {
    private K key; private V value;
    public Pair(K k, V v) { key=k; value=v; }
    public K getKey() { return key; }
    public V getValue() { return value; }
}

Pair<String, Integer> p = new Pair<>("age", 25); // 鑽石語法 JDK 7+

通配符與類型邊界

無界通配符

表示「未知類型」,僅能讀取為 Object,不能寫入 (除 null)。

void printAll(Collection<?> c) {
    for (Object o : c) System.out.println(o);
    // c.add(new Object()); // 編譯錯誤
}

上界通配符

「生產者 extends」——只能讀取 T 或其子類,不可寫入。

void drawAll(List<? extends Shape> shapes) {
    for (Shape s : shapes) s.draw(canvas);
    // shapes.add(new Circle()); // 編譯錯誤
}

下界通配符

「消費者 super」——可寫入 T 或其子類,讀取只能作為 Object。

void addRectangles(List<? super Rectangle> list) {
    list.add(new Rectangle()); // 合法
    Object o = list.get(0);    // 僅能作為 Object 讀取
}

PECS 原則總結

Producer Extends, Consumer Super
需從結構讀取元素 → ? extends T
需向結構寫入元素 → ? super T
既要讀又要寫 → 不用通配符,用具體類型

泛型方法

類型參數宣告在修飾符後、返回型別前:

public static <T> void copyArrayToList(T[] src, List<T> dest) {
    for (T t : src) dest.add(t);
}

// 呼叫時編譯器自動推導 T
String[] sa = {"a", "b"};
List<String> ls = new ArrayList<>();
copyArrayToList(sa, ls); // T 推導為 String

多重邊界與遞迴邊界

<T extends Comparable<T> & Serializable> T max(Collection<T> c)
// T 必須實作 Comparable 且 Serializable

// 遞迴邊界:Enum 定義
class Enum<E extends Enum<E>> { ... }

類型擦除與橋接方法

  • 泛型資訊僅存在編譯期,執行期被擦除為原始類型
  • 編譯器自動生成橋接方法保護多態性
  • 無法在執行期檢查具體泛型類型:list instanceof List 非法

自動裝箱/拆箱與泛型協同

List<Integer> list = new ArrayList<>();
list.add(42);       // 自動裝箱 int → Integer
int sum = list.get(0); // 自動拆箱 Integer → int

實戰最佳實踐

  1. 優先使用集合介面宣告:List<String> list = new ArrayList<>();
  2. API 設計遵循 PECS 原則,最大化靈活性
  3. 避免混用原始類型與泛型,消除非檢查警告
  4. 文檔化類型參數約束與語義
  5. 利用靜態工廠方法簡化構造:Collections.emptyList()

總結

泛型是 Java 型別系統的重大進化,通過編譯期類型檢查消除大量強制轉型與 ClassCastException。掌握通配符邊界、PECS 原則、泛型方法與類型擦除機制,是編寫健壯、可復用 Java 程式庫的關鍵能力。

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