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

Java 泛型完整指南:從類別、方法、介面到通配符與類型擦除

     編輯:Java 程式設計入門

為什麼需要泛型?

在 JDK 1.5 之前,若想設計一個可容納任意型別的容器(如座標點),只能使用 Object 型別,導致兩大問題:

  1. 型別不安全:編譯期無法檢查,執行期才拋出 ClassCastException。
  2. 程式碼雜亂:到處充斥著強制轉型 (String)obj。

泛型類別

使用型別參數 <T> 延遲型別綁定至實例化時:

class Point<T> {
    private T x, y;
    public Point(T x, T y) { this.x = x; this.y = y; }
    public T getX() { return x; }
    public void setX(T x) { this.x = x; }
    // ... 同理 y
}

// 使用
Point<Double> p1 = new Point<>(12.23, 23.21); // 無需轉型
Point<Integer> p2 = new Point<>(12, 23);
Point<String> p3 = new Point<>("北緯29度", "東經113度");

編譯器會強制檢查:new Point<Double>("str", 1.2) 直接報錯,消除執行期型別風險。

原始型別

為相容舊代碼,允許不指定型別參數:Point p = new Point(1.2, 3.4);。編譯器會發出「未檢查」警告,實際視為 Object 處理。

泛型方法

型別參數宣告在修飾符與回傳型別之間,適用於單一操作需支援多型別:

class Print {
    public <T> void print(T t) { System.out.println(t); }
    public <E> void show(E e) { System.out.println(e); }
}

// 呼叫
Print p = new Print();
p.print(12);
p.print("hello");
p.show(new Integer(33));

此處泛型僅提供語法糖,配合自動裝箱/拆箱,實際與 Object 參數差異不大。

泛型介面

兩種實作方式:

interface Inter<T> { void print(T t); }

// 方式一:實作時指定具體型別
class InterDemo1 implements Inter<String> {
    public void print(String t) { System.out.println("print: " + t); }
}

// 方式二:保持泛型,實例化時確定
class InterDemo2<T> implements Inter<T> {
    public void print(T t) { System.out.println("print: " + t); }
}

// 使用
new InterDemo1().print("hello");
new InterDemo2<Integer>().print(23);

進階主題:通配符與邊界

語法含義適用場景
<? extends Number>上界通配符,只能讀取消費者(Producer Extends)
<? super Integer>下界通配符,只能寫入生產者(Consumer Super)
<?>無界通配符,等同 <? extends Object>僅需 Object 方法時

類型擦除

Java 泛型僅存在於編譯期,執行期會被擦除為原始型別(Object 或邊界型別)。因此:

  • 無法使用 new T()、T.class、instanceof T。
  • 靜態成員無法引用類別的型別參數。
  • 重寫方法簽名擦除後不得衝突。

最佳實踐建議

  1. 優先使用泛型類別/介面,減少強制轉型。
  2. API 設計時,參數用 extends(生產者),回傳用 super(消費者)——PECS 原則。
  3. 避免混用原始型別與泛型,消除編譯警告。
  4. 需保留型別資訊時,傳遞 Class<T> 或使用 TypeToken(Gson 模式)。

總結

泛型將型別檢查前置至編譯期,大幅提升程式碼安全性與可讀性。理解類型擦除、通配符邊界、PECS 原則,是精通 Java 集合框架與 API 設計的關鍵。

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