Autoboxing 簡介

在 Java 中,有八種基本型別,分別是 byte, short, int, long, float, double, char 和 boolean。理論上來說,真正的物件導向中的型別應該都必須是類別定義,像是 Java 中的 Short, Integer 等等類別。不過為了我們使用上的方便,Java 提供了基本型別。同時存在這兩種型別常常會造成我們在設計上要加上許多額外的程式碼,例如在做數字運算時,使用 int 或 double 型別來處理,但是要將數字存入容器時,必須要將其轉換成 Integer 或 Double 型別,才能使用 add(new Integer(i)),在使用容器或多型處理時常常要多一道轉型手續。

Java 1.5 中,已經增加了這方面的處理,稱之為 Autoboxing 和 Auto-unboxing,編譯器會自動幫我們在 int 和 Integer 之中轉換。將 int 包裝成 Integer 稱之為 Autoboxing,反之則是 Auto-unboxing。底下是一個和泛型一起使用的例子:

輸出結果:
0-100-200-300-400-500-

另一個將 Autoboxing 和泛型 Map 一起使用的例子:

布林值的 autoboxing

Autoboxing 主要是在做基本型別和延伸型別之間的轉換,因此針對布林值 boolean 也同樣適用:

輸出結果:
false
java.lang.Boolean
false
false

值得注意的是,除了傳入值和傳回值會轉換外,在 if 敘述句中原本需要 boolean 運算式判斷的部份,也會自動轉換,以及 !bObj 也會。這和上例中拿 Integer 物件去做四則運算是類似的,可將運算子直接使用在在物件上,像是算術(+ - * / %)、遞增遞減(++ --)、比較(>= ==)、邏輯(&& || !)、指定(=)、算術指定(+=)、位元邏輯(& | ~ ^)、位移(>>)、位移指定(>>=) 等運算子都可以用。不過這對物件存取運算子(.)來說會出現問題,上例的 b.equals(bObj) 就會無法編譯。

浮點數的 autoboxing

浮點數的部份和上述一樣,可直接轉換。底下是和靜態載入一起合用的例子:

輸出結果:
2.5
27.07597043574791
28.274333882308138