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

Java 泛型編程九大避坑指南:從類型擦除到通配符陷阱

     編輯:Java 相關知識

前言

泛型是 Java 5 引入的編譯期類型安全機制,通過類型擦除實現,運行期不保留具體類型參數。這帶來一系列反直覺的限制與陷阱,本文總結九大必知注意點。

九大避坑指南

  1. 基本型別不可作為類型參數
    List<int> ❌ → List<Integer> ✅。自動裝箱/拆箱橋接基本型別與泛型。
  2. 運行期類型檢查失效
    List<String> 與 List<Employee> 擦除後均為 List。obj instanceof List<String> 編譯錯誤;若強轉成功,get(0) 返回型別不保證為 String。
  3. 泛型類不能繼承 Throwable
    class MyEx<T> extends Exception ❌。異常捕獲需具體類型,擦除後無法區分。
  4. 不能創建泛型數組
    new List<String>[10] ❌。數組保留運行期類型,與擦除機制衝突。改用 List<List<String>>。
  5. 不能實例化類型變數
    T t = new T() ❌。擦除後無法得知構造子。改用工廠模式或傳入 `Class<T>` 反射實例化。
  6. 靜態上下文不可使用類型參數
    靜態欄位/方法屬於原始類型,不屬於泛型實例。static T field、static void m(T t) 均 ❌。
  7. 避免定義 `equals(T)` 方法
    擦除後與 `Object.equals(Object)` 簽名衝突,導致覆寫失效或橋接方法混淆。
  8. 不同具體化類型之間無子型關係
    Pair<Number> p1 = new Pair<Integer>() ❌。泛型不變性。需用通配符 Pair<? extends Number> 表達協變。
  9. 勿混用原始類型與泛型類型
    Pair<Manager> mp = ...; Pair raw = mp; 編譯通過但極危險:`raw.setFirst(new Employee())` 運行期才拋 ClassCastException,破壞類型安全。

最佳實踐建議

  • 全面啟用編譯器警示 `-Xlint:unchecked`。
  • 優先使用集合框架標準介面 (`List<T>` 而非 `ArrayList<T>`)。
  • API 設計時合理運用 `` (生產者) 與 `` (消費者) — PECS 原則。
  • 文檔註明類型參數約束與線程安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved