【Java】変数の暗黙的な型変換・キャストとボクシング・アンボクシングについて

アイキャッチ画像

型の変換

Javaで扱う変数には型があります。代表的なものはint、double、charなどです。

データ型を使う中で、異なる型を組み合わせた演算や代入が出てきます。しかし、異なる型同士では処理することができないため、型の変換をする必要があります。

暗黙的な型変換

暗黙的な型変換とは、Javaが内部で処理に合わせて自動で型の変換を行ってくれることです。

「小さい型」から「大きい型」への変換は、暗黙的な型変換が行われます。

以下の図で左側から右側への型変換は自動で行われるため、コードではなにも書く必要はありません。

byte → short → int → long → float → double

int x = 100;
long y = x;

(例1)int型→long型

float f = 5.0f;
double d = f;

(例2)float型→double型

キャスト(明示的な型変換)

一方、「大きい型」から「小さい型」への変換は何も書かずに実行しようとするとコンパイルエラーになります。

long m = 100l;
short n = m;
// コンパイルエラー

(例3)long型→short型・キャストなし

この場合、以下のようにキャストと呼ばれる明示的型変換を示す記述をする必要があります。

変換後に合わせたい型を括弧で書くだけです。

long m = 100l;
short n = (short)m;
// エラーなし

(例4)long型→short型・キャストあり

ボクシング(boxing)/アンボクシング(unboxing)

ボクシング/アンボクシングとは、基本型(プリミティブ型)とラッパークラス(参照型)の変換を自動で行うことです。自動で行ってくれるため、オートボクシング/オートアンボクシングと呼ばれることもあります。

暗黙的な型変換/キャストと似ていますが、ボクシング/アンボクシングは基本的に対応している2つの型同士でしか使えません。(以下参照)

基本型(プリミティブ型)ラッパークラス(参照型)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

int i = 10;
Integer j = i;

(例5)int型→Integer型 (基本型→ラッパークラス)

Integer a = 99;
int b = a;

(例6)Integer型→int型 (ラッパークラス→基本型)

アンボクシングの注意点

基本的にボクシング/アンボクシングは意識しなくても問題は起こりませんが、一点だけ注意点があります。それは、参照型変数はnullを扱えますが、基本型はnullを扱えないという点です。

この場合、コンパイルエラーは発生せず実行時にNullPointerExceptionが発生します。

Integer num1 = null;
int num2 = num1;
// 実行時NullPointerException

(例7)

(応用)キャストとボクシング/アンボクシングの併用

キャストとボクシングまたはアンボクシングを併用することで、

以下のようにfloat型からInteger型へ一行で変換することも可能です。

float f = 10.0f;
Integer i = (int)f;
// float→intはキャスト、その後Integerへの変換はボクシング

(例8)

まとめ

Javaの型変換は非常に便利ですが、ルールを知らないと思わぬエラーや不具合につながることがあります。日々のコーディングで、型変換の動きを意識することが、バグの少ないプログラムを書く第一歩です。