2. 使用Autoboxing和Auto-Unboxing
使用Autoboxing和Auto-Unboxing,並不需要什麼特別的步驟,一切都會在編譯器的安排下自動發生。
現在可以這樣來對待一個int型的數據:
清單3:自動完成的Boxing操作
Collection al = new ArrayList();
al.add(1);
因為編譯器會悄悄的把這段代碼轉換成接近這個樣子:
清單4:作了Autoboxing之後的等價形式
Collection al = new ArrayList();
al.add(Integer.valueOf(1));
這裡所用的能接受int類型的值為參數,生成Integer實例的valueOf方法,是J2SE 1.5中新加入的內容。其它包裹類也都有可以接受對應的基本類型的值為參數,生成對應的包裹類實例的valueOf方法加入。
而這樣對待一個Integer型的對象也是可以的:
清單5:自動完成的Unboxing操作
Integer one = new Integer(1);
int two = one + 1;
因為編譯器會悄悄的把這段代碼轉換成類似這個形狀:
清單6:作了Auto-Unboxing之後的等價形式
Integer one = new Integer(1);
int two = one.intValue() + 1;
大體上,只要把一個結果類型是基本類型的表達式,放到需要讓它們的包裹類出現的位置上,就會誘發Autoboxing;類似的,只要把一個結果類型是包裹類的表達式,放到只允許相應的基本類型出現的位置上,就會誘發Auto-Unboxing。
“Autoboxing/Auto-Unboxing”特性的來源
J2SE 1.5中增加的許多語言特性都可以在C#裡找到對應的東西。不過根據Bruce Eckel對Joshua Bloch的采訪,盡管Java的研發小組確實很關注C#(Joshua Bloch本人的案頭就放著一本關於C#的書),但是只有“Autoboxing/Auto-Unboxing”和“Metadata”確實是從C#中直接借鑒來的特性。