最近知ったのですが、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に備わっているというのが調べてわかって少し安心しました。
(それでも私の場合は明示的に型変換すると思いますが。あくまでも異なる型だというのを意識するために。)