intやcharに代表されるプリミティブ型と、IntegerやCharacterに代用されるラッパークラスの間では暗黙の型変換が行われます。
プリミティブ型からラッパークラスへの暗黙の型変換をオートボクシング、ラッパークラスからプリミティブ型への暗黙の型変換をアンボクシングと呼びます。
例えば、intとIntegerを明示的に型変換すると以下のようになります。
【サンプルコード】
// 変数定義
int primitive = 1;
Integer wrapper = null;
// プリミティブ型からラッパークラスへの変換
wrapper = new Integer(primitive);
// ラッパークラスからプリミティブ型への変換
// (変換が正しく行われればif文の中に入り変数の中身を出力)
if (primitive == wrapper.intValue()) {
System.out.println(wrapper.intValue());
}
【結果】
1
しかし、以下のように、暗黙の型変換に頼ったコードでも通ります。
【サンプルコード】
// 変数定義
int primitive = 1;
Integer wrapper = null;
// プリミティブ型からラッパークラスへの変換
wrapper = primitive;
// ラッパークラスからプリミティブ型への変換
// (変換が正しく行われればif文の中に入り変数の中身を出力)
if (primitive == wrapper) {
System.out.println(wrapper);
}
【結果】
1
昔は明示的に型変換しなくても動くのを不安に感じていましたが、それを可能とする仕組みがjavaの仕様として組み込まれているのを知ってからは安心して使っています。
プログラミングでは型の違いで意図しない挙動になることがよくあるので、コンパイルエラーにならないから良しとするのではなく、本当に意図した挙動になるのか調べるべきだと思っています。
今回の記事で、オートボクシング・アンボクシングを知る方が増えれば幸いです。
コメント