アンボクシング変換
日本語 | 逆箱詰め変換 |
英語 | unboxing conversion |
ふりがな | あんぼくしんぐへんかん |
フリガナ | アンボクシングヘンカン |
ラッパークラスからそのプリミティブ型へ暗黙的キャストできる機能。
J2SE 5.0で追加された構文。
ラッパークラスの参照からプリミティブ型の変数へ初期化もしくは代入すると、自動的にキャストが行われる。これを「アンボクシング変換」と言う。またその逆を「ボクシング変換」と言い、合わせて「オートボクシング」と呼ぶ。
J2SE 1.4以前ではこのような書き方はできなかった。それは当然で、ラッパークラスの参照はあくまで参照であり、その参照値をプリミティブ型変数に格納できないからである。
しかしそれでは不便であるということで、このような変換が可能となった。
アンボクシング変換は、内部的には「ラッパークラスに対応したメソッドを呼び出す」ことで行われる。
ラッパークラスがIntegerクラスであればintValue()メソッド、DoubleクラスであればdoubleValue()メソッド、というようにラッパークラスごとに「どのメソッドを呼び出すのか」が仕様で決められている。
そのため「double d = new Integer( 100 );」のようにラッパークラスとプリミティブ型が食い違っていても、内部的にはIntegerクラスのintValue()メソッドが呼ばれ、その戻り値がdouble型へ暗黙的キャストされるため、結果的にアンボクシング変換が可能となる。
呼ばれるメソッドはラッパークラスごとに固定である。そのため、short型へのアンボクシング変換は、IntegerクラスがshortValue()メソッドを持っているにも関わらず行えない。そういった場合は素直にshortValue()メソッドを呼び出した方がいいだろう。
J2SE 5.0で追加された構文。
ラッパークラスの参照からプリミティブ型の変数へ初期化もしくは代入すると、自動的にキャストが行われる。これを「アンボクシング変換」と言う。またその逆を「ボクシング変換」と言い、合わせて「オートボクシング」と呼ぶ。
J2SE 1.4以前ではこのような書き方はできなかった。それは当然で、ラッパークラスの参照はあくまで参照であり、その参照値をプリミティブ型変数に格納できないからである。
しかしそれでは不便であるということで、このような変換が可能となった。
アンボクシング変換は、内部的には「ラッパークラスに対応したメソッドを呼び出す」ことで行われる。
ラッパークラスがIntegerクラスであればintValue()メソッド、DoubleクラスであればdoubleValue()メソッド、というようにラッパークラスごとに「どのメソッドを呼び出すのか」が仕様で決められている。
そのため「double d = new Integer( 100 );」のようにラッパークラスとプリミティブ型が食い違っていても、内部的にはIntegerクラスのintValue()メソッドが呼ばれ、その戻り値がdouble型へ暗黙的キャストされるため、結果的にアンボクシング変換が可能となる。
呼ばれるメソッドはラッパークラスごとに固定である。そのため、short型へのアンボクシング変換は、IntegerクラスがshortValue()メソッドを持っているにも関わらず行えない。そういった場合は素直にshortValue()メソッドを呼び出した方がいいだろう。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// Integerクラスのインスタンスを作り、100を入れます。
Integer integer1 = new Integer( 100 );
// これをint型変数へアンボクシング変換します。
int i1 = integer1;
System.out.println( i1 );
// 100
// これはJ2SE 1.4以前ではコンパイルエラーになります。
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : java.lang.Integer
// 期待値 : int
// アンボクシング変換を使わずに変換する場合には
// intValue()メソッド等で取得します。
int i2 = integer1.intValue();
System.out.println( i2 );
// 100
// 型が異なっていてもアンボクシング変換は機能します。
// たとえばIntegerクラスからdouble型へアンボクシング変換
// することが可能です。
double d = integer1;
System.out.println( d );
// 100.0
// アンボクシング変換は、ラッパークラスごとに決められた
// メソッドを呼ぶだけなので、呼び出したあと暗黙的キャスト
// が可能ならアンボクシング変換も可能ということになります。
// つまり上記の例の場合、
d = new Integer( 100 );
// が、
d = new Integer( 100 ).intValue();
// とintValue()メソッドが呼ばれていて、その戻り値が
// double型に暗黙的キャストされているというわけです。
// 逆に言えば、メソッドから返された値が暗黙的キャスト
// できない場合はコンパイルエラーになります。
// ※コンパイルエラーの例
// short s = integer1;
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : java.lang.Integer
// 期待値 : short
// ※Eclipseのエラーメッセージ
// 型の不一致: Integer から short には変換できません
// ※コンパイルエラーの例ここまで
// intValue()メソッドの戻り値の型はintなので、shortへは
// 暗黙的キャストできませんから、このようにコンパイルエラー
// となります。
// そういう時は素直に対応するメソッドを呼び出しましょう。
short s = integer1.shortValue();
System.out.println( s );
// 100
}
}
public class Sample
{
public static void main( String[] args )
{
// Integerクラスのインスタンスを作り、100を入れます。
Integer integer1 = new Integer( 100 );
// これをint型変数へアンボクシング変換します。
int i1 = integer1;
System.out.println( i1 );
// 100
// これはJ2SE 1.4以前ではコンパイルエラーになります。
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : java.lang.Integer
// 期待値 : int
// アンボクシング変換を使わずに変換する場合には
// intValue()メソッド等で取得します。
int i2 = integer1.intValue();
System.out.println( i2 );
// 100
// 型が異なっていてもアンボクシング変換は機能します。
// たとえばIntegerクラスからdouble型へアンボクシング変換
// することが可能です。
double d = integer1;
System.out.println( d );
// 100.0
// アンボクシング変換は、ラッパークラスごとに決められた
// メソッドを呼ぶだけなので、呼び出したあと暗黙的キャスト
// が可能ならアンボクシング変換も可能ということになります。
// つまり上記の例の場合、
d = new Integer( 100 );
// が、
d = new Integer( 100 ).intValue();
// とintValue()メソッドが呼ばれていて、その戻り値が
// double型に暗黙的キャストされているというわけです。
// 逆に言えば、メソッドから返された値が暗黙的キャスト
// できない場合はコンパイルエラーになります。
// ※コンパイルエラーの例
// short s = integer1;
// ※javacのエラーメッセージ
// 互換性のない型
// 検出値 : java.lang.Integer
// 期待値 : short
// ※Eclipseのエラーメッセージ
// 型の不一致: Integer から short には変換できません
// ※コンパイルエラーの例ここまで
// intValue()メソッドの戻り値の型はintなので、shortへは
// 暗黙的キャストできませんから、このようにコンパイルエラー
// となります。
// そういう時は素直に対応するメソッドを呼び出しましょう。
short s = integer1.shortValue();
System.out.println( s );
// 100
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // Integerクラスのインスタンスを作り、100を入れます。 Integer integer1 = new Integer( 100 ); // これをint型変数へアンボクシング変換します。 int i1 = integer1; System.out.println( i1 ); // 100 // これはJ2SE 1.4以前ではコンパイルエラーになります。 // ※javacのエラーメッセージ // 互換性のない型 // 検出値 : java.lang.Integer // 期待値 : int // アンボクシング変換を使わずに変換する場合には // intValue()メソッド等で取得します。 int i2 = integer1.intValue(); System.out.println( i2 ); // 100 // 型が異なっていてもアンボクシング変換は機能します。 // たとえばIntegerクラスからdouble型へアンボクシング変換 // することが可能です。 double d = integer1; System.out.println( d ); // 100.0 // アンボクシング変換は、ラッパークラスごとに決められた // メソッドを呼ぶだけなので、呼び出したあと暗黙的キャスト // が可能ならアンボクシング変換も可能ということになります。 // つまり上記の例の場合、 d = new Integer( 100 ); // が、 d = new Integer( 100 ).intValue(); // とintValue()メソッドが呼ばれていて、その戻り値が // double型に暗黙的キャストされているというわけです。 // 逆に言えば、メソッドから返された値が暗黙的キャスト // できない場合はコンパイルエラーになります。 // ※コンパイルエラーの例 // short s = integer1; // ※javacのエラーメッセージ // 互換性のない型 // 検出値 : java.lang.Integer // 期待値 : short // ※Eclipseのエラーメッセージ // 型の不一致: Integer から short には変換できません // ※コンパイルエラーの例ここまで // intValue()メソッドの戻り値の型はintなので、shortへは // 暗黙的キャストできませんから、このようにコンパイルエラー // となります。 // そういう時は素直に対応するメソッドを呼び出しましょう。 short s = integer1.shortValue(); System.out.println( s ); // 100 } }