泛型是 Java 5 引入的編譯期類型安全機制,通過類型擦除實現,運行期不保留具體類型參數。這帶來一系列反直覺的限制與陷阱,本文總結九大必知注意點。
List<int> ❌ → List<Integer> ✅。自動裝箱/拆箱橋接基本型別與泛型。List<String> 與 List<Employee> 擦除後均為 List。obj instanceof List<String> 編譯錯誤;若強轉成功,get(0) 返回型別不保證為 String。class MyEx<T> extends Exception ❌。異常捕獲需具體類型,擦除後無法區分。new List<String>[10] ❌。數組保留運行期類型,與擦除機制衝突。改用 List<List<String>>。T t = new T() ❌。擦除後無法得知構造子。改用工廠模式或傳入 `Class<T>` 反射實例化。static T field、static void m(T t) 均 ❌。Pair<Number> p1 = new Pair<Integer>() ❌。泛型不變性。需用通配符 Pair<? extends Number> 表達協變。Pair<Manager> mp = ...; Pair raw = mp; 編譯通過但極危險:`raw.setFirst(new Employee())` 運行期才拋 ClassCastException,破壞類型安全。