HOWTO · Java
Java でのオートボクシングとアンボクシング
このチュートリアルでは、Java での自動ボックス化とボックス化解除の使用方法を示します。
オートボクシングはプリミティブデータ型を同等のラッパー型に変換し、アンボクシングはラッパー型をプリミティブデータ型に変換することです。この機能は Java に組み込まれています。
このチュートリアルでは、Java での自動ボクシングとアンボクシングの使用について説明およびデモンストレーションします。
Java での自動ボクシング
上記のように、自動ボクシングはプリミティブデータ型をオブジェクトと同じラッパー型クラスに変換します。たとえば、long から Long または int から Integer です。
これらのプリミティブデータ型とそれに対応するラッパー型クラスのリストを以下に示します。
| プリミティブ型 | ラッパーの型 |
|---|---|
int |
Integer |
boolean |
Boolean |
double |
Double |
float |
Float |
byte |
Byte |
char |
Character |
long |
Long |
short |
Short |
Java で自動ボクシングを使用できる場合は 3つあります。
- どのメソッドでも、プリミティブデータ型をパラメーターとして渡す必要があります。そのメソッドには、対応するラッパークラスオブジェクトが必要です。
- 対応するラッパークラスを持つ変数にプリミティブデータ型を割り当てている間。
- コレクションフレームワーククラスを操作している間、コンパイラは Java でオートボクシングを実行する必要があります。
3つのケースがあります。それぞれの場合の例を作成してみましょう。最初のケースの例を参照してください。
package Delfstack;
public class Autoboxing_Test {
public static void Number(Integer x) {
System.out.println(x);
}
public static void main(String[] args) {
// Compiler performs Autoboxing here. it converts primitive type to wrapper type Integer object.
int x = 10;
Number(x);
}
}
プリミティブ型 int をパラメーターとして、ラッパークラス Integer を必要とするメソッドに渡しました。コンパイラはここでオートボクシングを実行します。出力を参照してください:
10
2 番目のケースの例を参照してください。
package Delfstack;
public class Autoboxing_Test {
public static void main(String[] args) {
// Assigning primitive long value to Wrapper Long variable x. Compiler performs autoboxing
Long x = 430L;
// Assigning primitive char value to Wrapper Character variable y. Compiler performs autoboxing
Character y = 'a';
System.out.println(x);
System.out.println(y);
}
}
プリミティブデータ型の値をラッパー型変数に割り当て、コンパイラーがオートボクシングを実行しました。出力を参照してください:
430
a
3 番目のケースの例を参照してください。
package Delfstack;
import java.util.ArrayList;
public class Autoboxing_Test {
public static void main(String[] args) {
ArrayList<Long> Long_List = new ArrayList<Long>();
// while working with collections framework the compiler performs autoboxing
Long_List.add(220L);
Long_List.add(330L);
System.out.println(Long_List);
}
}
コレクションフレームワーククラスを操作している間、コンパイラは上記のコードのように Java でオートボクシングを実行する必要があります。プリミティブ型の long 要素をラッパー型の Long リストに追加します。出力を参照してください:
[220, 330]
Javaでのアンボックス
Java でのボックス化解除は、ラッパークラスのオブジェクトを同じプリミティブデータ型に変換します。これは、オートボクシングの反対の操作です。たとえば、Integer を int に、または Long を long に変換すると、前のテーブルをボクシングに使用することもでき、その逆も可能です。
また、アンボクシングは以下の3つのケースで適用できる。
- ラッパークラスのオブジェクトを、プリミティブ型の値を必要とするメソッドに渡している間。
- ラッパークラスオブジェクトが対応するプリミティブ変数に割り当てられている場合。
- コレクションフレームワークを操作している間。
Java の各ケースの例を試してみましょう。最初のケースの例を参照してください。
package Delfstack;
public class Unboxing_Test {
public static void Number(int x) {
System.out.println(x);
}
public static void main(String[] args) {
Integer x = new Integer(340);
// We passed Integer wrapper class object, the compiler will convert it to int because method
// requires int
Number(x);
}
}
コンパイラーは、ラッパークラスのオブジェクトをプリミティブ型の値を必要とするメソッドに渡すときに、ボックス化解除を実行します。出力を参照してください:
340
2 番目のケースの例:
package Delfstack;
public class Unboxing_Test {
public static void main(String[] args) {
Long x = new Long(340L);
Integer y = new Integer(450);
// Performing unboxing here. assigning Long object to primitive long type similarly Integer to
// int
long a = x;
int b = y;
System.out.println(a);
System.out.println(b);
}
}
ラッパークラスオブジェクトが対応するプリミティブ変数に割り当てられると、コンパイラはボックス化解除を実行します。出力を参照してください:
340
450
3 番目のケースの例:
package Delfstack;
import java.util.ArrayList;
public class Unboxing_Test {
public static void main(String[] args) {
ArrayList<Long> Long_List = new ArrayList<Long>();
Long_List.add(230L);
Long_List.add(340L);
Long_List.add(450L);
// The get method returns an Long object and we assigned it to the long primitive type
long x = (long) Long_List.get(0);
long y = (long) Long_List.get(1);
long z = (long) Long_List.get(2);
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
ArrayList のようなコレクションフレームワークを操作しているときに、ArrayList リスト要素をプリミティブ型の変数に割り当てようとすると、コンパイラはボックス化解除を実行します。出力を参照してください:
230
340
450