JavaA2Z

KAB-studio > プログラミング > JavaA2Z > オートボクシングとは

オートボクシング

日本語 自動箱詰め
英語 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形である。
殴り合ったりはしない。

参考サイト


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

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

// 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を加え、
        // それをボクシング変換で再セットしています。

        // このようにオートボクシングによって、ラッパークラス
        // はプリミティブ型とほぼ同じように使用できるように
        // なったわけです。
   }
}
// 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を加え、
        // それをボクシング変換で再セットしています。

        // このようにオートボクシングによって、ラッパークラス
        // はプリミティブ型とほぼ同じように使用できるように
        // なったわけです。
   }
}

この単語を含むページ

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

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

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