JavaA2Z

KAB-studio > プログラミング > JavaA2Z > アンボクシング変換とは

アンボクシング変換

日本語 逆箱詰め変換
英語 unboxing conversion
ふりがな あんぼくしんぐへんかん
フリガナ アンボクシングヘンカン

解説

ラッパークラスからそのプリミティブ型暗黙的キャストできる機能。
J2SE 5.0で追加された構文。

ラッパークラス参照からプリミティブ型変数初期化もしくは代入すると、自動的キャストわれる。これを「アンボクシング変換」と言う。またその逆を「ボクシング変換」と言い、合わせて「オートボクシング」と呼ぶ。

J2SE 1.4以前ではこのような書き方はできなかった。それは当然で、ラッパークラス参照はあくまで参照であり、その参照値をプリミティブ型変数に格納できないからである。
しかしそれでは不便であるということで、このような変換が可能となった。

アンボクシング変換は、内部的には「ラッパークラスに対応したメソッド呼び出す」ことでわれる。
ラッパークラスIntegerクラスであればintValue()メソッドDoubleクラスであればdoubleValue()メソッド、というようにラッパークラスごとに「どのメソッド呼び出すのか」が仕様で決められている。
そのため「double d = new Integer( 100 );」のようにラッパークラスプリミティブ型が食い違っていても、内部的にはIntegerクラスintValue()メソッドが呼ばれ、その戻り値double暗黙的キャストされるため、結果的にアンボクシング変換が可能となる。
呼ばれるメソッドラッパークラスごとに固定である。そのため、shortへのアンボクシング変換は、IntegerクラスshortValue()メソッドを持っているにも関わらずえない。そういった場合は素直にshortValue()メソッド呼び出した方がいいだろう。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// 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
    }
}
// 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
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2009/06/05
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。