3. オートボクシング
2005.11.15 株式会社四次元データ CTO 畠中晃弘
ボクシング・アンボクシングは、プリミティブ型と対応するラッパクラス参照(たとえば int と Integer)を自動的に相互変換するするものです。J2SE1.4までは、プリミティブ型とラッパクラス参照を相互変換するためには、明示的にデータ変換しなければいけませんでした。コレクションにはオブジェクトしか登録できないため、プリミティブ型データをコレクションに登録したりコレクションから取得する際など、毎回データ変換が必要でした。J2SE5.0では、そのような変換が自動的に行われるようになりました。
3.1. ボクシング
ボクシングは、プリミティブ型からクラス参照への変換です。プリミティブ型とラッパ型の対応は以下の表の通りです。
プリミティブ型 | ラッパクラス |
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
ボクシング変換により、以下のようなプログラムを記述することが出来ます。
Integer i = 100; Character c = 'c';
これまでプリミティブ型で実現されていた整数リテラル代入時のナローイング変換(int→short, int→byteなど)は同時に行うことができますが、数値のワイドニング変換(short→int等)はコンパイルエラーとなります。
Byte b = 100; // 100 は int 型リテラルであるが、byte に代入可能である short s = 10; int i = s; // OK(暗黙のワイドニング変換) Integer j = s; // コンパイルエラー
もちろん、プリミティブ型で暗黙的に変換できないようなケースではボクシング変換でも同様にコンパイルエラーとなります。
int i = 100; byte b = i; // byte 型は int 型より表せる値の範囲が狭いため、コンパイルエラー Byte bb = i; // 同様にコンパイルエラー
3.2. アンボクシング
アンボクシングは、ラッパクラスからプリミティブ型への変換です。
int i = new Integer(100); char c = new Character('c');
暗黙の型変換についてもボクシングの場合と同じことが言えますが、暗黙の型変換はプリミティブ型のみで起こるという点には注意してください。
int i = new Short(10); // Short → short → int と変換される
オートアンボクシングにより、これまでプリミティブ型しか記述できなかった箇所にオブジェクトを記述できるようになりました。if 文や for 文、while 文などのの条件式のところに Boolean 型の参照を記述できますし、switch...case 文の値としても Integer/Short/Character/Byte 型の参照が記述できます。
アンボクシングを実行したときに、ラッパクラス参照が null であれば NullPointerException が発生します。
Inteter a = null; int b = a; // NullPointerException 発生
ボクシングとアンボクシングおよびジェネリクスを組み合わせることにより、プリミティブ型値を扱うコレクションを操作するプログラムが大幅に簡略化されます。たとえばこれまでは以下のようなプログラムを書いていました。
List list = new ArrayList(); list.add(new Integer(100)); list.add(new Integer(200)); int a = ((Integer) list.get(0)).intValue(); int b = ((Integer) list.get(1)).intValue();
これが J2SE5.0 では次のように書くことができます。
List<Ingeter> list = new ArrayList<Integer>(); list.add(100); // ボクシング list.add(200); int a = list.get(0); // アンボクシング int b = list.get(1);