ボクシング


値型の暗黙的な変換

従来の Java 言語では、数値や true、false などの定数はオブジェクトとは別の特別な値型として扱われていました。 値型は参照型とは異なり、実体を持たない単純な型なので高速に動作しますが、一方で Object 型から派生している参照型のように統一した方法で扱うことができないという問題がありました。

この問題を解決するために、Java プラットフォームはクラスライブラリで値型をオブジェクトとして提供するラッパークラスを用意していました。 代表的な例として、int 型の値をオブジェクトとして扱うには Integer クラスを用いました。 同様に boolean に対して Boolean 型、float 型に対して Float 型というようにクラスが用意されています。

しかし、値型を参照型にするには new 演算子でインスタンスを生成し、インスタンスから intValue() などで値を得るという作業が必要でした。

J2SE 5.0 では、ボクシングの機能によって、暗黙的に値型が参照型に変換されたり、参照型が値型に変換されるように改良されました。 従来の Java で、文字列リテラルが自動的に String オブジェクトのインスタンスを生成したように、ボクシングは必要に応じて値を参照型に変換してくれます。 値型を自動的に参照型に変換することをオートボクシングと呼び、逆に参照型を値型に変換することをアンボクシングと呼びます。

Integer objValue = new Integer(100); //従来の方法
Integer objValue = 100; //OK
int iValue = objValue; //OK

このように、新しい Java 言語では、値から直接 Integer などのオブジェクトに変換したり、逆にラッパークラス型のオブジェクトを暗黙的に値型に変換することができます。

class Test {
	public static void main(String args[]) {
		Integer objValue = 100;
		int iValue = objValue;

		System.out.println("objValue=" + objValue);
		System.out.println("iValue=" + iValue);
	}
}

このプログラムでは、値型 100 を Integer 型の変数に代入しています。 従来の Java では型が異なるというエラーになりましたが、新しい Java では値型 100 を自動的に Integer オブジェクトに変換するように認識してくれます。

class Test {
	public static void main(String args[]) {
		Boolean objValue = true;
		boolean blValue = Boolean.FALSE;

		System.out.println("objValue=" + objValue);
		System.out.println("blValue=" + blValue);
	}
}

boolean 型と Boolean 型など、数値以外の値型でも同様です。 true や flase は、ボクシングによって自動的に Boolean に変換することができ Boolean オブジェクトは自動的に boolean 型に変換することができます。

ボクシングが適用されるのは代入変換だけではありません。 算術演算など、式や文の中で変換が必要とされた場合はその時点で適用されます。 そのため、計算式の中に Integer 型と int 型の変数や値を混在させることができます。

class Test {
	public static void main(String args[]) {
		Integer objValue1 = 10;
		Integer objValue2 = 100;
		Integer objValue3 = 1000 + objValue1 + objValue2;

		System.out.println("objValue3=" + objValue3);
	}
}

このプログラムでは、objValue3 の初期化子に Integer 型の objValue1 と objValue2、そして値型の 1000 を混在させて指定しています。 objValue1 や objValue2 は、このときに一度アンボクシングされて計算され、その結果はオートボクシングによって Integer 型に変換されます。



前のページへ戻る次のページへ