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

J2SE 5.0 自動裝箱/拆箱深度解析(三):自動裝箱觸發時機與類型限制

     編輯:J2SE

自動裝箱三大觸發場景

當基本型別值出現在**需要參考類型**的語境時,編譯器自動插入 Xxx.valueOf(primitive) 呼叫。

1. 指派給參考類型變數

Integer obj = 31415; // → Integer.valueOf(31415)

2. 傳遞給參考類型參數

Map map = new HashMap<>();
map.put(true, "value"); // → Boolean.valueOf(true)

3. 強制轉型為參考類型

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 parammethod(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:**不快取**,每次新建物件

實務建議

  1. 集合存放數值優先用 valueOf 靜態工廠,避免 new
  2. 公開 API 參數型別:基本型別表達「必填」,包裝類型表達「可為 null」
  3. 避免在運算式混用基本/包裝類型,提取區域變數統一型別
  4. 大量數值運算場景考慮基本型別陣列或專用庫(FastUtil 等)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved