Java 泛型自 JDK 5.0 引入以來,極大地提升了程式碼的類型安全性與可讀性。然而,受限於類型擦除機制,泛型在運行時期的行為往往與直覺不符。以下整理九大核心限制與常見陷阱,助你避開開發中的隱性 Bug。
int、float 等原生類型替換泛型參數,必須使用對應的包裝類型 Integer、Float 等。Pair<String> 與 Pair<Integer> 在運行時皆為 Pair。a instanceof Pair<String> 編譯不通過,僅能檢查 a instanceof Pair,無法保證 getFirst() 返回 String。Throwable,因此不能作為異常拋出。new T[10] 或 new List<String>[10] 均為非法,會導致編譯錯誤。T instance = new T(); 為非法語法,因為運行時無法得知 T 的具體類型。Object.equals(Object) 衝突,導致方法簽名重複編譯錯誤。Pair<Manager> p1; Pair<Employee> p2; p1 = p2; 編譯錯誤,即使 Manager 繼承 Employee。Pair<Manager> managerBuddies = new Pair<Manager>(ceo, cfo);
Pair rawBuddies = managerBuddies; // 編譯通過但有運行時風險
編譯器僅發出警告,但運行時若放入非 Manager 物件將拋出 ClassCastException。Class<T> 傳遞類型資訊給運行時(Type Token 模式)深入理解類型擦除機制,是掌握 Java 泛型精髓的關鍵。編寫健壯泛型代碼的核心原則:在編譯期盡可能多發現錯誤,不要將類型安全問題留到運行期。