Posted at

【Java】オートボクシング、アンボクシング

More than 3 years have passed since last update.

Javaのまとめ記事です。


プリミティブ型、参照型

Javaではプリミティブ型(基本型)と参照型の2つの型があります。

プリミティブ型は8つあります。

そして8つのプリミティブ型それぞれに、参照型であるラッパークラスが存在します。

プリミティブ型
ラッパークラス

boolean
Boolean

char
Character

byte
Byte

short
Short

int
Integer

long
Long

float
Float

double
Double

このプリミティブ型とラッパークラスの変換を自動で行ってくれる仕組みがあります。

プリミティブ型からラッパークラスへの変換をオートボクシング、ラッパークラスからプリミティブ型への変換をアンボクシングといいます。


オートボクシング

プリミティブ型からラッパークラスへの自動変換をオートボクシングといいます。


Java

int numInt = 10;

Integer numInteger = numInt;

int型で宣言されたnumIntをInteger型へ明示的に変換する必要がありません。

オートボクシングの機能を使わずに明示的に変換しようとすると以下のようになります。


Java

int numInt = 10;

Integer numInteger = new Integer(numInt);
// または以下
Integer numInteger = Integer.valueOf(numInt);


アンボクシング

ラッパークラスからプリミティブ型への変換をアンボクシングといいます。


Java

Integer numInteger = new Integer(10);

int numInt = numInteger;

こちらも、Integer型で宣言されたnumIntegerを明示的にint型へ変換する必要がありません。

アンボクシングの機能を使わずに明示的に変換しようとすると以下のようになります。


Java

Integer numInteger = new Integer(10);

int numInt = numInteger.intValue();


気をつけたいこと

ラッパークラスは参照型のため、nullが入る可能性があります。

nullが入ったラッパークラスオブジェクトをアンボクシング機能を使ってプリミティブ型へ変換するとNullPointerExceptionが発生します。


Java

Integer numInteger = null;

int numInt = numInteger; //実行時にNullPointerException発生

int numInt = numInteger;のコードは実際は

int numInt = numInteger.intValue();です。

numIntegerがnullのため、NullPointerExceptionが発生してしまいます。

上記は簡単なコードですが、実際のプログラムでもこのようにnullが格納された変数をアンボクシング機能でプリミティブ型へ変換する可能性はあります。

気をつけないと思わぬバグが入り込んでしまうことがあります。


Eclipseでの設定

オートボクシング、アンボクシングに対して警告を出せます。

ウィンドウ>設定>Java>コンパイラー>エラー/警告>潜在的なプログラミングの問題>ボクシングおよびアンボクシング変換