ボクシング変換
日本語 | 箱詰め変換 |
英語 | boxing conversion |
ふりがな | ぼくしんぐへんかん |
フリガナ | ボクシングヘンカン |
プリミティブ型からそのラッパークラスへ暗黙的キャストできる機能。
J2SE 5.0で追加された構文。
プリミティブ型の変数やリテラルを使用して、ラッパークラスの参照を初期化もしくは代入すると、自動的にキャストが行われる。これを「ボクシング変換」と言う。またその逆を「アンボクシング変換」と言い、合わせて「オートボクシング」と呼ぶ。
正確には、この時ラッパークラスのインスタンスが作られ、その中にプリミティブ型の値(この例では「100」)が格納され、参照型変数(この例ではinteger1)がインスタンスを参照する。
J2SE 1.4以前ではこのような書き方はできなかった。それは当然で、ラッパークラスの参照はあくまで参照であり、参照値以外の値を格納できないからである。
しかしそれでは不便であるということで、このような変換が可能となった。
ボクシング変換を行う際には、必ずプリミティブ型に対応するラッパークラスを使用する必要がある。
たとえば「Long long1 = 100;」はコンパイルエラーになる。「100」は整数リテラルであり、整数リテラルはint型であり、int型に対応するラッパークラスはIntegerクラスでありLongクラスではないからである。
このように、プリミティブ型であれば暗黙的キャストが行われる場合でも、ボクシング変換では対応するラッパークラスにしか変換できないため注意すること。
J2SE 5.0で追加された構文。
プリミティブ型の変数やリテラルを使用して、ラッパークラスの参照を初期化もしくは代入すると、自動的にキャストが行われる。これを「ボクシング変換」と言う。またその逆を「アンボクシング変換」と言い、合わせて「オートボクシング」と呼ぶ。
正確には、この時ラッパークラスのインスタンスが作られ、その中にプリミティブ型の値(この例では「100」)が格納され、参照型変数(この例ではinteger1)がインスタンスを参照する。
J2SE 1.4以前ではこのような書き方はできなかった。それは当然で、ラッパークラスの参照はあくまで参照であり、参照値以外の値を格納できないからである。
しかしそれでは不便であるということで、このような変換が可能となった。
ボクシング変換を行う際には、必ずプリミティブ型に対応するラッパークラスを使用する必要がある。
たとえば「Long long1 = 100;」はコンパイルエラーになる。「100」は整数リテラルであり、整数リテラルはint型であり、int型に対応するラッパークラスはIntegerクラスでありLongクラスではないからである。
このように、プリミティブ型であれば暗黙的キャストが行われる場合でも、ボクシング変換では対応するラッパークラスにしか変換できないため注意すること。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// int型変数を作って中に100を入れておきます。
int i = 100;
// これをIntegerクラスへボクシング変換します。
Integer integer1 = i;
System.out.println( integer1 );
// 100
// これはJ2SE 1.4以前ではコンパイルエラーになります。
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : int
// 期待値 : java.lang.Integer
// ボクシング変換を使わずに変換する場合には
// Integerクラスのインスタンスを作り、その時
// コンストラクタに渡しましょう。
Integer integer2 = new Integer( 200 );
System.out.println( integer2 );
// 200
// 型が異なるとボクシング変換は機能しません。
// たとえばint→doubleへは暗黙的キャストが可能です。
double d = i;
// でもこれをボクシング変換で行うことはできません。
// ※コンパイルエラーの例
// Double double1 = i;
// ※javacのエラーメッセージ
// 互換性のない型
// 正しくは "Identifier" です。
// 検出値 : int
// 期待値 : java.lang.Double
// ※Eclipseのエラーメッセージ
// integer を解決できません
// ※コンパイルエラーの例ここまで
// そのため、意外にも以下はコンパイルエラーになります。
// ※コンパイルエラーの例
// Long long1 = 300;
// ※コンパイルエラーの例ここまで
// 整数リテラルはint型だからです。
// この場合、以下のようにLを付けてlong型にすれば大丈夫。
Long long1 = 300L;
System.out.println( long1 );
// 300
}
}
public class Sample
{
public static void main( String[] args )
{
// int型変数を作って中に100を入れておきます。
int i = 100;
// これをIntegerクラスへボクシング変換します。
Integer integer1 = i;
System.out.println( integer1 );
// 100
// これはJ2SE 1.4以前ではコンパイルエラーになります。
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : int
// 期待値 : java.lang.Integer
// ボクシング変換を使わずに変換する場合には
// Integerクラスのインスタンスを作り、その時
// コンストラクタに渡しましょう。
Integer integer2 = new Integer( 200 );
System.out.println( integer2 );
// 200
// 型が異なるとボクシング変換は機能しません。
// たとえばint→doubleへは暗黙的キャストが可能です。
double d = i;
// でもこれをボクシング変換で行うことはできません。
// ※コンパイルエラーの例
// Double double1 = i;
// ※javacのエラーメッセージ
// 互換性のない型
// 正しくは "Identifier" です。
// 検出値 : int
// 期待値 : java.lang.Double
// ※Eclipseのエラーメッセージ
// integer を解決できません
// ※コンパイルエラーの例ここまで
// そのため、意外にも以下はコンパイルエラーになります。
// ※コンパイルエラーの例
// Long long1 = 300;
// ※コンパイルエラーの例ここまで
// 整数リテラルはint型だからです。
// この場合、以下のようにLを付けてlong型にすれば大丈夫。
Long long1 = 300L;
System.out.println( long1 );
// 300
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // int型変数を作って中に100を入れておきます。 int i = 100; // これをIntegerクラスへボクシング変換します。 Integer integer1 = i; System.out.println( integer1 ); // 100 // これはJ2SE 1.4以前ではコンパイルエラーになります。 // ※javacのエラーメッセージ // 互換性のない型 // 検出値 : int // 期待値 : java.lang.Integer // ボクシング変換を使わずに変換する場合には // Integerクラスのインスタンスを作り、その時 // コンストラクタに渡しましょう。 Integer integer2 = new Integer( 200 ); System.out.println( integer2 ); // 200 // 型が異なるとボクシング変換は機能しません。 // たとえばint→doubleへは暗黙的キャストが可能です。 double d = i; // でもこれをボクシング変換で行うことはできません。 // ※コンパイルエラーの例 // Double double1 = i; // ※javacのエラーメッセージ // 互換性のない型 // 正しくは "Identifier" です。 // 検出値 : int // 期待値 : java.lang.Double // ※Eclipseのエラーメッセージ // integer を解決できません // ※コンパイルエラーの例ここまで // そのため、意外にも以下はコンパイルエラーになります。 // ※コンパイルエラーの例 // Long long1 = 300; // ※コンパイルエラーの例ここまで // 整数リテラルはint型だからです。 // この場合、以下のようにLを付けてlong型にすれば大丈夫。 Long long1 = 300L; System.out.println( long1 ); // 300 } }