| 維度 | 方法參數 (值參數) | 泛型參數 (類型參數) |
| 作用對象 | 運行時值 | 編譯時類型 |
| 語法位置 | 方法括號內 (int x) | 類/方法聲明處 class Box |
| 傳遞機制 | 調用時傳值 | 實例化/調用時傳類型 |
| 可省略類型 | 不可 (Java 10+ var 僅限局部變量) | 鑽石操作符 new Box<>() 可推斷 |
| 運行時保留 | 值存在棧/堆 | 類型擦除,運行時不可用 |
泛型本質:類型參數化
泛型 = 「延遲綁定類型」。在定義類/方法時用佔位符 T 表示「任意類型」,使用時具體化為 String、Integer 等。
代碼對比
// 方法參數:處理具體值
void print(String s) { System.out.println(s); }
print("hello"); // 傳遞值
// 泛型參數:處理類型族
class Box { // T 是類型參數
private T value;
public void set(T v) { value = v; } // 方法參數 v 類型為 T
public T get() { return value; }
}
Box box = new Box<>(); // 傳遞類型參數 String
box.set("hello"); // 傳遞值參數 "hello"
泛型參數能省略嗎?
- 聲明處不能省略:
class Box 必須寫 T
- 使用處可省略 (Java 7+ 鑽石語法):
new Box<>() 編譯器推斷
- 方法調用處可省略:
box.set("hello") 推斷 T 為 String
為什麼需要泛型?
- 類型安全:編譯期檢查,避免
ClassCastException
- 代碼復用:一份邏輯服務多種類型
- 消除強轉:
List list; String s = list.get(0); 無需 (String)
類型擦除補充
Java 泛型僅在編譯期存在,運行時 Box 和 Box 都是 Box。這是為兼容舊版本 JVM 設計的妥協。
總結
方法參數 = 值的佔位符 (運行時綁定值)。
泛型參數 = 類型的佔位符 (編譯期綁定類型,運行時擦除)。
兩者協同工作:void set(T value) 中 T 來自泛型參數,value 是方法參數。
- 上一篇文章: Java volatile 關鍵字:不能保證原子性與線程安全的深度解析
- 下一篇文章: Java 查看 JDK 內部類庫源代碼的方法:IDE 與命令行方案
Copyright ©
程式碼之家 All Rights Reserved