?1. 類型安全(Type Safety)?
在泛型出現之前,集合類(如?ArrayList
、HashMap
)只能存儲?Object
?類型元素,導致以下問題:
- ?問題?:從集合中取出元素時,需手動強制類型轉換,容易因類型不匹配導致運行時錯誤(如?
ClassCastException
)。// JDK 1.4 時代:非泛型示例 List list = new ArrayList(); list.add("Hello"); Integer num = (Integer) list.get(0); // 編譯通過,運行時報 ClassCastException
- ?泛型解決方案?:
通過指定集合存儲的具體類型,編譯器在編譯期即可檢查類型合法性,避免運行時錯誤。List<String> list = new ArrayList<>(); list.add("Hello"); String str = list.get(0); // 無需強制轉換,且非法類型操作(如添加 Integer)會被編譯器攔截
?2. 消除強制類型轉換?
- ?問題?:非泛型代碼需要頻繁進行類型轉換,代碼冗余且易錯。
List list = new ArrayList(); list.add("Apple"); String fruit = (String) list.get(0); // 必須強制轉換
- ?泛型解決方案?:
泛型自動處理類型轉換,代碼更簡潔,泛型擦除原理。List<String> list = new ArrayList<>(); list.add("Apple"); String fruit = list.get(0); // 直接獲取 String 類型
?3. 代碼復用與通用算法?
- ?問題?:非泛型代碼需為不同類型重復實現相同邏輯。
例如,排序方法需要為?Integer
、String
?等類型各寫一個版本。public void sortIntegers(List integers) { /* 排序邏輯 */ } public void sortStrings(List strings) { /* 相同邏輯,僅類型不同 */ }
- ?泛型解決方案?:
泛型允許編寫通用的類、接口和方法,支持多種類型復用同一邏輯。public <T extends Comparable<T>> void sort(List<T> list) {// 單一方法適用于所有 Comparable 類型 }
?4. 增強代碼可讀性與維護性?
- ?問題?:非泛型代碼中集合的類型意圖不明確,需通過注釋或變量名猜測。
List users = new ArrayList(); // 存儲的是什么?User 對象?String?
- ?泛型解決方案?:
通過類型參數顯式聲明集合用途,代碼自解釋性更強。List<User> users = new ArrayList<>(); // 明確存儲 User 對象
?5. 解決原始類型(Raw Type)的缺陷?
- ?問題?:非泛型代碼使用原始類型(如?
List
),編譯器無法檢測非法操作。List list = new ArrayList(); list.add(123); list.add("abc"); // 允許混合類型,導致后續操作風險
- ?泛型解決方案?:
泛型強制約束集合元素的類型,避免非法插入。List<Integer> list = new ArrayList<>(); list.add(123); list.add("abc"); // 編譯器報錯:類型不匹配
?總結?
泛型的引入主要解決以下問題:
- ?類型安全?:編譯時類型檢查,避免運行時?
ClassCastException
。 - ?消除強制轉換?:簡化代碼,減少冗余操作。
- ?通用編程?:支持編寫復用性更高的代碼(如通用集合和算法)。
- ?代碼清晰性?:通過類型參數明確數據意圖,提升可讀性。