當基本型別值出現在**需要參考類型**的語境時,編譯器自動插入 Xxx.valueOf(primitive) 呼叫。
Integer obj = 31415; // → Integer.valueOf(31415)
Map
Object obj = (Long) 27828L; // → Long.valueOf(27828L)
編譯器**先裝箱再轉型**,不支援「基本型別 → 非對應包裝類型」的直接轉換。
int i = 27828;
Long l = (Long) i; // 編譯錯誤:int → Integer → Long 不相容
// 等價於編譯器嘗試生成:
Long l = (Long) Integer.valueOf(i); // Integer 非 Long 子類
int i = 27828;
Long l = (Long) (long) i; // 1. int → long(基本型別擴展) 2. long → Long(裝箱)
// 或分步驟
long primitive = i;
Long boxed = Long.valueOf(primitive);
| 原始碼 | 編譯器生成 | 說明 |
|---|---|---|
| Integer i = 10; | Integer i = Integer.valueOf(10); | 標準裝箱 |
| list.add(10); | list.add(Integer.valueOf(10)); | 集合需物件 |
| Object o = 10; | Object o = Integer.valueOf(10); | 參考類型變數 |
| method(10); // Object param | method(Integer.valueOf(10)); | 參數為參考類型 |
| (Number) 10; | (Number) Integer.valueOf(10); | Integer 是 Number 子類,合法 |
| (Long) 10; | 編譯錯誤 | Integer 非 Long 子類 |
Integer.valueOf(int):-128 ~ 127 回傳快取實例(JVM 參數 -XX:AutoBoxCacheMax 可調整上限)Boolean.valueOf(boolean):永遠回傳 Boolean.TRUE/FALSE 單例Byte/Short/Long/Character:類似快取範圍(通常 -128~127)Float/Double:**不快取**,每次新建物件valueOf 靜態工廠,避免 new