オートボクシング
日本語 | 自動箱詰め |
英語 | autoboxing |
ふりがな | おーとぼくしんぐ |
フリガナ | オートボクシング |
ラッパークラスとプリミティブ型を相互に暗黙的キャストできる機能。
J2SE 5.0で追加された構文。
Integerクラス等のラッパークラスを使用する場合、J2SE 5.0以前ではインスタンスの生成やintValue()メソッドによる値の取得が必要だった。
これらはJ2SE 5.0以降自動的に行うことが可能となった。プリミティブ型からラッパークラスへの変換を「ボクシング変換」、ラッパークラスからプリミティブ型への変換を「アンボクシング変換」と呼び、合わせて「オートボクシング」と呼ぶ。
「ボクシング変換」と「アンボクシング変換」の細かい使用方法についてはそれぞれの項目を参照のこと。
オートボクシングを使用することで、プリミティブ型がより使いやすくなる。
逆に言えば、コードの省略以外にメリットはないので、慣れなければ無理に使う必要はないだろう。
オートボクシングが便利な場面のひとつに、コレクションの要素の型をプリミティブ型にしたい場合がある。
コレクションクラスの要素には、プリミティブ型は使用できず、参照を使用しなければならない(これはジェネリックを使用する場合も同様)。たとえばArrayListクラスを使用する際に、各要素をint型にすることはできず、代わりに各要素をIntegerクラスとしなければならない。
そのため、J2SE 5.0以前は、要素の追加時にはラッパークラスのインスタンスを作り、要素の取得時にはラッパークラスの参照で受ける必要があった。
これが、J2SE 5.0以降は、オートボクシングを使用することでプリミティブ型を直接追加・取得可能となった。これにより、実質的にコレクションクラスの要素の型にプリミティブ型を使用可能となった。
オートボクシングが便利な場面としてもうひとつ、ラッパークラスの参照型変数に演算子を使用可能となったことも挙げられる。
たとえばJ2SE 5.0以前は、ラッパークラスの参照型変数に「++演算子」「--演算子」を使用する場合には、一度値を取り出して1加えた後、もう一度インスタンス内に入れ直さなければならなかった。
これが、J2SE 5.0以降は、オートボクシングによって直接演算子を使用することが可能となった。
このように、オートボクシングはいちいち面倒な処理を行わなければならなかった部分で、明らかな省力化をもたらしてくれる便利な機能であるため、使用することをお勧めする。
ちなみに「ボクシング」とは、「箱に詰める」を意味する動詞「box」のing形である。
殴り合ったりはしない。
J2SE 5.0で追加された構文。
Integerクラス等のラッパークラスを使用する場合、J2SE 5.0以前ではインスタンスの生成やintValue()メソッドによる値の取得が必要だった。
これらはJ2SE 5.0以降自動的に行うことが可能となった。プリミティブ型からラッパークラスへの変換を「ボクシング変換」、ラッパークラスからプリミティブ型への変換を「アンボクシング変換」と呼び、合わせて「オートボクシング」と呼ぶ。
「ボクシング変換」と「アンボクシング変換」の細かい使用方法についてはそれぞれの項目を参照のこと。
オートボクシングを使用することで、プリミティブ型がより使いやすくなる。
逆に言えば、コードの省略以外にメリットはないので、慣れなければ無理に使う必要はないだろう。
オートボクシングが便利な場面のひとつに、コレクションの要素の型をプリミティブ型にしたい場合がある。
コレクションクラスの要素には、プリミティブ型は使用できず、参照を使用しなければならない(これはジェネリックを使用する場合も同様)。たとえばArrayListクラスを使用する際に、各要素をint型にすることはできず、代わりに各要素をIntegerクラスとしなければならない。
そのため、J2SE 5.0以前は、要素の追加時にはラッパークラスのインスタンスを作り、要素の取得時にはラッパークラスの参照で受ける必要があった。
これが、J2SE 5.0以降は、オートボクシングを使用することでプリミティブ型を直接追加・取得可能となった。これにより、実質的にコレクションクラスの要素の型にプリミティブ型を使用可能となった。
オートボクシングが便利な場面としてもうひとつ、ラッパークラスの参照型変数に演算子を使用可能となったことも挙げられる。
たとえばJ2SE 5.0以前は、ラッパークラスの参照型変数に「++演算子」「--演算子」を使用する場合には、一度値を取り出して1加えた後、もう一度インスタンス内に入れ直さなければならなかった。
これが、J2SE 5.0以降は、オートボクシングによって直接演算子を使用することが可能となった。
このように、オートボクシングはいちいち面倒な処理を行わなければならなかった部分で、明らかな省力化をもたらしてくれる便利な機能であるため、使用することをお勧めする。
ちなみに「ボクシング」とは、「箱に詰める」を意味する動詞「box」のing形である。
殴り合ったりはしない。
参考サイト
// Sample.java
import java.util.ArrayList;
public class Sample
{
public static void main( String[] args )
{
// int型変数を作って中に100を入れておきます。
int i1 = 100;
// これをIntegerクラスへボクシング変換します。
Integer integer1 = i1;
System.out.println( integer1 );
// 100
// さらにこれをint型変数にアンボクシング変換します。
int i2 = integer1;
System.out.println( i2 );
// 100
// このように、J2SE 5.0から、プリミティブ型とラッパークラス
// を相互に暗黙的キャストできるようになりました。
// このふたつを合わせて「オートボクシング」と言います。
// 細かい使用方法については「ボクシング変換」
// 「アンボクシング変換」の項目を参考にしてください。
// ■オートボクシングが便利な場面その1:
// コレクションの要素をプリミティブ型にしたい場合。
// コレクションクラスの要素には参照しか指定できません。
// ※コンパイルエラーの例
// ArrayList<int> arylst = new ArrayList<int>();
// ※javacのエラーメッセージ
// 予期しない型
// 検出値 : int
// 期待値 : 参照
// ※Eclipseのエラーメッセージ
// トークン "int" に構文エラーがあります。このトークンの
// 後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// そのため、対応するラッパークラスを指定します。
ArrayList<Integer> arylst = new ArrayList<Integer>();
// オートボクシングを使用しない場合、要素を追加する
// 際に、いちいちラッパークラスのインスタンスを
// 作る必要がありました。
arylst.add( new Integer( 300 ) );
// 値を取得する時にも、一度Integerクラスの参照で
// 受け取らなければいけません。
Integer e0 = arylst.get( 0 );
// ところがオートボクシングを使用すれば、
// プリミティブ型を直接追加・取得できるのです!
arylst.add( 301 );
int e1 = arylst.get( 1 );
System.out.println( e1 );
// 301
// このように、オートボクシングのおかげで、実質的に
// プリミティブ型を要素の型にすることが可能となった
// わけです。
// ■オートボクシングが便利な場面その2:
// オートボクシングによって、ラッパークラスの
// インクリメント/デクリメントが可能になりました。
Integer integer2 = new Integer( 500 );
++integer2;
System.out.println( integer2 );
// 501
// この時、内部的には以下の処理が行われています。
integer2 = integer2.intValue() + 1;
// アンボクシング変換で値を取り出してから、1を加え、
// それをボクシング変換で再セットしています。
// このようにオートボクシングによって、ラッパークラス
// はプリミティブ型とほぼ同じように使用できるように
// なったわけです。
}
}
import java.util.ArrayList;
public class Sample
{
public static void main( String[] args )
{
// int型変数を作って中に100を入れておきます。
int i1 = 100;
// これをIntegerクラスへボクシング変換します。
Integer integer1 = i1;
System.out.println( integer1 );
// 100
// さらにこれをint型変数にアンボクシング変換します。
int i2 = integer1;
System.out.println( i2 );
// 100
// このように、J2SE 5.0から、プリミティブ型とラッパークラス
// を相互に暗黙的キャストできるようになりました。
// このふたつを合わせて「オートボクシング」と言います。
// 細かい使用方法については「ボクシング変換」
// 「アンボクシング変換」の項目を参考にしてください。
// ■オートボクシングが便利な場面その1:
// コレクションの要素をプリミティブ型にしたい場合。
// コレクションクラスの要素には参照しか指定できません。
// ※コンパイルエラーの例
// ArrayList<int> arylst = new ArrayList<int>();
// ※javacのエラーメッセージ
// 予期しない型
// 検出値 : int
// 期待値 : 参照
// ※Eclipseのエラーメッセージ
// トークン "int" に構文エラーがあります。このトークンの
// 後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// そのため、対応するラッパークラスを指定します。
ArrayList<Integer> arylst = new ArrayList<Integer>();
// オートボクシングを使用しない場合、要素を追加する
// 際に、いちいちラッパークラスのインスタンスを
// 作る必要がありました。
arylst.add( new Integer( 300 ) );
// 値を取得する時にも、一度Integerクラスの参照で
// 受け取らなければいけません。
Integer e0 = arylst.get( 0 );
// ところがオートボクシングを使用すれば、
// プリミティブ型を直接追加・取得できるのです!
arylst.add( 301 );
int e1 = arylst.get( 1 );
System.out.println( e1 );
// 301
// このように、オートボクシングのおかげで、実質的に
// プリミティブ型を要素の型にすることが可能となった
// わけです。
// ■オートボクシングが便利な場面その2:
// オートボクシングによって、ラッパークラスの
// インクリメント/デクリメントが可能になりました。
Integer integer2 = new Integer( 500 );
++integer2;
System.out.println( integer2 );
// 501
// この時、内部的には以下の処理が行われています。
integer2 = integer2.intValue() + 1;
// アンボクシング変換で値を取り出してから、1を加え、
// それをボクシング変換で再セットしています。
// このようにオートボクシングによって、ラッパークラス
// はプリミティブ型とほぼ同じように使用できるように
// なったわけです。
}
}
// Sample.java import java.util.ArrayList; public class Sample { public static void main( String[] args ) { // int型変数を作って中に100を入れておきます。 int i1 = 100; // これをIntegerクラスへボクシング変換します。 Integer integer1 = i1; System.out.println( integer1 ); // 100 // さらにこれをint型変数にアンボクシング変換します。 int i2 = integer1; System.out.println( i2 ); // 100 // このように、J2SE 5.0から、プリミティブ型とラッパークラス // を相互に暗黙的キャストできるようになりました。 // このふたつを合わせて「オートボクシング」と言います。 // 細かい使用方法については「ボクシング変換」 // 「アンボクシング変換」の項目を参考にしてください。 // ■オートボクシングが便利な場面その1: // コレクションの要素をプリミティブ型にしたい場合。 // コレクションクラスの要素には参照しか指定できません。 // ※コンパイルエラーの例 // ArrayList<int> arylst = new ArrayList<int>(); // ※javacのエラーメッセージ // 予期しない型 // 検出値 : int // 期待値 : 参照 // ※Eclipseのエラーメッセージ // トークン "int" に構文エラーがあります。このトークンの // 後には Dimensions を指定する必要があります // ※コンパイルエラーの例ここまで // そのため、対応するラッパークラスを指定します。 ArrayList<Integer> arylst = new ArrayList<Integer>(); // オートボクシングを使用しない場合、要素を追加する // 際に、いちいちラッパークラスのインスタンスを // 作る必要がありました。 arylst.add( new Integer( 300 ) ); // 値を取得する時にも、一度Integerクラスの参照で // 受け取らなければいけません。 Integer e0 = arylst.get( 0 ); // ところがオートボクシングを使用すれば、 // プリミティブ型を直接追加・取得できるのです! arylst.add( 301 ); int e1 = arylst.get( 1 ); System.out.println( e1 ); // 301 // このように、オートボクシングのおかげで、実質的に // プリミティブ型を要素の型にすることが可能となった // わけです。 // ■オートボクシングが便利な場面その2: // オートボクシングによって、ラッパークラスの // インクリメント/デクリメントが可能になりました。 Integer integer2 = new Integer( 500 ); ++integer2; System.out.println( integer2 ); // 501 // この時、内部的には以下の処理が行われています。 integer2 = integer2.intValue() + 1; // アンボクシング変換で値を取り出してから、1を加え、 // それをボクシング変換で再セットしています。 // このようにオートボクシングによって、ラッパークラス // はプリミティブ型とほぼ同じように使用できるように // なったわけです。 } }