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

Java 集合泛型核心機制:編譯期類型安全與類型擦除

     編輯:Java 綜合教學

泛型的核心價值

  1. 將運行時 ClassCastException 前移至編譯期:編譯器拒絕類型不匹配代碼
  2. 消除強制類型轉換:list.get(0) 直接返回 String 而非 Object

自定義泛型方法

public static <T> T test(T t) {
    return t; // 占位符 T 由調用時實際參數類型推斷
}

// 調用
String s = test("abc");      // T 推斷為 String
Integer i = test(123);       // T 推斷為 Integer(自動裝箱)
  • 泛型參數慣用 T(Type)、E(Element)、K(Key)、V(Value)
  • 基本類型無法作為類型參數,**必須使用包裝類**

集合泛型實戰

ArrayList<String> list = new ArrayList<>(); // 鑽石操作符 JDK 7+
list.add("aa"); list.add("bb");
// list.add(123); // 編譯報錯:類型不匹配

for (String str : list) {
    System.out.println(str.toUpperCase()); // 無需強轉
}

類型擦除本質

  • 泛型信息**僅存在於編譯階段**,字節碼中被擦除為原始類型(Raw Type)
  • ArrayList<String> 編譯後實際是 ArrayList,get() 返回 Object,編譯器自動插入 checkcast 指令
  • 運行時無法區分 List 與 List

常見陷阱與應對

陷阱原因解決
無法創建泛型數組 new T[10]擦除後類型信息丟失用 List<T> 或反射 Array.newInstance(clazz, size)
instanceof 檢查泛型運行時無泛型信息檢查原始類型:list instanceof List
靜態成員引用類型參數靜態屬於類,非實例改為實例字段或方法局部變量

通配符與邊界

  • <? extends T>:上界通配符,**只讀**場景(生產者)
  • <? super T>:下界通配符,**只寫**場景(消費者)
  • PECS 原則:**P**roducer **E**xtends,**C**onsumer **S**uper
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved