3. 發生Autoboxing的具體時機
發生Autoboxing的具體時機,主要有這麼三種:
把基本類型的數據賦給引用類型的變量時。例如把一個int型的數據賦給一個Integer型變量。
清單7:賦給引用類型的變量基本類型的數據
Integer i = 31415;
把基本類型的數據傳給引用類型的參數時。例如給一個定義成Object的參數傳遞一個boolean型的數據。
清單8:傳給引用類型的參數基本類型的數據
HashMap map = new HashMap();
map.put(true, null);
把基本類型的數據往引用類型上強制轉化時。例如在一個long型的數據前面加上(Long)。
清單9:從基本類型的數據到引用類型上強制轉化
System.out.println((Long) 27828L);
4. Autoboxing的局限
Autoboxing的機制有一個局限——只能把基本類型的數據往它們自己的包裹類(以及包裹類的上級類)上轉化。
類似這樣的代碼是不能工作的,盡管int型的數據完全可以用一個Long對象來表示:
清單10:不能同時進行自動向上轉型和Autoboxing
int i = 27828;
System.out.println((Long) i);/* 編譯時出錯 */
這是因為這段代碼實際上相當於:
清單11:Autoboxing操作會在自動向上轉型之前發生
int i = 27828;
System.out.println((Long) Integer.valueOf(i));/* 編譯時出錯 */
而Integer並不是Long的子類,所以這個轉化無法進行。如果一定要進行這種操作,需要手工追加一次轉型:
清單12:需要先強制向上轉型,再作Boxing
int i = 27828;
System.out.println((Long)(long) i);