// 擦除後等效代碼
public class Box {
private T value;
public void set(T value) { this.value = value; } // 擦除為 set(Object)
public T get() { return value; } // 擦除為 Object get()
}
// 導致的限制:
// 1. 不能 new T()、不能 T[]、不能 instanceof T
// 2. 靜態字段/方法不能引用類型參數
// 3. 異常類不能泛型、catch 不能用類型參數
實戰陷阱與最佳實踐
1. 避免原始類型
List list = new ArrayList(); // 原始類型,失去類型檢查
List
2. 方法簽名優先通配符
// 差:泛型方法無實際類型關係
public void print(List list) { ... }
// 好:通配符表達「任意元素列表」
public void print(List> list) { ... }
3. 類型令牌模式繞過擦除
// 獲取運行時泛型類型
TypeToken> token = new TypeToken>() {};
Type type = token.getType(); // ParameterizedType: List
// 實現原理:匿名子類保留簽名信息
class TypeToken {
final Type type;
TypeToken() { type = getClass().getGenericSuperclass(); }
}
4. 可變參數堆污染
@SafeVarargs // 聲明開發者確保安全
public final void addAll(List list, T... elements) { ... }