My Photo

« LV99でもRajaは強かった #FF11 | Main | 拡張for文(for-each) »

February 26, 2012

ボクシング/アンボクシング

基本データがからそのラッパークラスへの自動変換がボクシング(boxing)で、ラッパークラスから基本データがへの自動変換がアンボクシング(unboxing)。
以下のコードではボクシング/アンボクシングを使ってコードを簡素化している。push()でListに追加するところでボクシング変換、pop()の値を返すところでアンボクシング変換が行われている。

import java.util.*;

class IntStack { // 5.0 version
  private List<Integer> elements;

  public IntStack(int initialCapacity) {
    elements = new ArrayList<Integer>(initialCapacity);
  }

  public void push(int e) {
    elements.add(e);
  }

  public int pop() {
    if (elements.size() == 0) {
      throw new EmptyStackException();
    }
    return elements.remove(elements.size() - 1);
  }
}

以下のような場面でボクシング/アンボクシング変換が行われる。

代入

Integer x = 1; // ボクシング
int y = x; // アンボクシング

基本データ型とその基本データ型に対応するラッパークラスとの間の変換が行われるのであって、以下のようにshortとIntegerの間では変換されない。変換するには明示的にキャストを入れる必要がある。

Short s = 1;
int y = s;  // コンパイルエラー

メソッド呼び出し

class UnboxingParameter {
  public static void main(String[] args) {
    showInt(new Integer(10));
    showInt(new Integer(20));
  }

  public static void showInt(int i) {
    System.out.println("int value = " + i);
  }
}

演算

ラッパークラスに対して演算子を直接適用できる。ただし、演算のたびにラッパークラスのインスタンスが作られるので多用すべきではない。

Integer i = 1;
i++;
i = i + i;

フロー制御文の条件

if や for などのフロー制御文の条件にBoolean型を指定できる。

switch

switchの条件にInteger、Short、Byte、Characterを使用できる。

Integer i = ...;
...
switch (i) {
  case 0:
    ...
  case 1:
    ...

}


参考記事:Java Press Vol.38 続報 J2SE 5.0 実践チュートリアル

« LV99でもRajaは強かった #FF11 | Main | 拡張for文(for-each) »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54082185

Listed below are links to weblogs that reference ボクシング/アンボクシング:

« LV99でもRajaは強かった #FF11 | Main | 拡張for文(for-each) »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof