| 字母 | 含義 | 典型使用場景 | 來源 |
| E | Element | 集合元素類型:`List`、`Set`、`Queue` | Collection Framework |
| T | Type | 通用類型參數:`Class`、`Callable`、`Comparator` | Generic Type |
| K | Key | 鍵類型:`Map`、`ConcurrentHashMap` | Key |
| V | Value | 值類型:`Map`、`Future` | Value |
| N | Number | 數值類型:`NumberUtils` | Number |
| S, U, V... | 第2、3、4...類型參數 | 多參數泛型:`Function`、`BiFunction` | Type Sequence |
代碼示例
// 標準庫實現片段
public interface List extends Collection { ... }
public interface Map { V put(K key, V value); }
public class Class { public T newInstance() ... }
public interface Comparator { int compare(T o1, T o2); }
// 自定義泛型類
public class Pair { // 語義清晰:鍵值對
private K key; private V value;
public Pair(K k, V v) { key=k; value=v; }
public K getKey() { return key; }
public V getValue() { return value; }
}
// 任意標識符也合法(但不推薦)
public class Box { // Apple 是類型參數名,非類名!
private Apple content;
public void set(Apple a) { content = a; }
public Apple get() { return content; }
}
// 使用時:Box box = new Box<>(); // 此處 String 替換 Apple
類型擦除與限制
- 泛型類型參數**只能是引用類型**(類、接口、數組、其他類型變量),**不能是基本類型**(`int`、`double` 等)
- 運行時類型信息被擦除:`List` 和 `List` 運行時都是 `List`
- 不能實例化類型參數:`new T()` 非法,需工廠或反射
- 不能創建泛型數組:`new T[10]` 非法,需 `List` 或 `(T[])new Object[10]`
最佳實踐
- 遵循慣例:單字母大寫,語義明確
- 多參數時按順序:`T`、`U`、`V` 或語義字母 `K`、`V`、`E`
- 複雜邊界用描述性名稱:`>` 可讀性優於 `>`
- 文檔註釋說明類型參數含義:`@param 元素類型`
- 上一篇文章: C++虛函數表原理實戰:手動解析vtable指針調用虛函數
- 下一篇文章: Gson源碼解析:Class到Type的向上轉型與類型擦除應對
Copyright ©
程式碼之家 All Rights Reserved