オートボクシング (不変) - 1

「こんにちは、アミーゴ!」

「今日はオートボクシングについてお話します。オートボクシングとは、何かを自動的にボックスに入れることです。」

「Java にはプリミティブ型だけでなく、Object クラスを継承する型があることを思い出してください。しかし、コレクションやジェネリックなどの便利なものは、Object を継承する型でのみ機能することがわかりました。」

「その後、あらゆるプリミティブ型に対応する非プリミティブ型を作成することが決定されました。」

プリミティブ型 非プリミティブ対応物
バイト バイト
短い 短い
整数 整数
長さ 長さ
浮く 浮く
ダブル ダブル
ブール値 ブール値
文字 キャラクター
空所 空所

「しかし、これらの型の間で常に変換するのは非常に不便です。」

int x = 3;
Integer y = new Integer(x + 1);
int z = y.intValue();

"特にコレクションを直接操作する場合:"

int[] numbers = new int[10];
ArrayList list = new ArrayList();
for (int i = 0; i < numbers.length; i++)
{
 list.add( new Integer(i));
}

「それが、Java の作成者がプリミティブ型の «オートボックス化» と、非プリミティブ型の 'アンボックス化' を発明した理由です。」

「仕組みは次のとおりです。

何が見える 本当に何が起こるのか
int x = 3;
Integer y = x + 1;
int x = 3;
Integer y = Integer.valueOf(x + 1);
int z = y;
int z = y.intValue();
Boolean b = Boolean.FALSE;
boolean a = b;
Boolean b = Boolean.FALSE;
boolean a = b.booleanValue();
Integer x = null;
int y = x;
Integer x = null; int y = x.intValue(); //Throws an exception

「すべて簡単です。int 型と Integer 型を相互に割り当てることができ、その他はすべてコンパイラが処理します。」

「それはとても便利ですね。」

「はい。でも微妙な点がありますので、それについては後でお話します。」