首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 泛型與 foreach 底層原理:Iterator 類型推導

     編輯:程式設計綜合問答

現象

聲明 ArrayList list 可 foreach 遍歷;去掉泛型 ArrayList list 則編譯報錯:incompatible types: Object cannot be converted to String。

底層原理:foreach 編譯器展開

// 源碼
for (String s : list) { ... }

// 編譯器生成 (JDK 5+)
Iterator it = list.iterator(); // 泛型情況:Iterator
while (it.hasNext()) {
    String s = it.next(); // 直接賦值,無需強轉
    ...
}

// 無泛型情況
Iterator it = list.iterator(); // 原始類型 Iterator
while (it.hasNext()) {
    String s = it.next(); // 編譯錯誤:it.next() 返回 Object
    // 必須手動強轉:String s = (String) it.next();
}

泛型的三大作用

類型擦除補充

  • 運行時泛型信息被擦除,List 和 List 同一個 Class 對象。
  • 但編譯器在字節碼中插入 **隱式強轉** (checkcast),保證類型安全。
  • 因此 foreach 無泛型時,編譯器看到 Iterator (原始類型),next() 簽名為 Object,拒絕賦值給 String。

最佳實踐

  1. **始終使用泛型**:new ArrayList() 或鑽石操作符 new ArrayList<>()。
  2. 避免原始類型:List list = new ArrayList() 會丟失類型檢查。
  3. 通配符 / 處理協變/逆變場景。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
作用說明示例
**類型安全**編譯期捕獲類型錯誤,避免運行時 ClassCastExceptionList list = new ArrayList<>(); list.add(123); // 編譯錯誤
**消除強轉**編譯器自動插入檢查轉換,代碼更乾淨foreach、流式 API 直接獲得正確類型
**代碼復用**同一邏輯適用多種類型class Box<T> { T value; }