アンボクシングのち拡大変換
変数に値を代入する際に、アンボクシング→プリミティブ拡大変換は起こる*1が
プリミティブ拡大変換→ボクシングは起こらないので、
intはLongになるがIntegerはlongにならない。
@SuppressWarnings("unused") public static void main(final String[] args) { // int -> Integer (boxing) Integer i1 = 100; // Integer -> int (unboxing) int i2 = Integer.valueOf(100); // int -> long (widening) long l1 = 100; // Integer -> long (unboxing -> widening) long l2 = Integer.valueOf(100); // int -> Long (no widening -> boxing) // Long l3 = 100; // Integer -> Long (no unboxing -> widening -> boxing) // Long l4 = Integer.valueOf(100); }
当然アンボクシング→プリミティブ拡大変換→ボクシングも起こらない。
言語仕様によると、ボクシング→参照型拡大とアンボクシング→プリミティブ型拡大は起こる。
a boxing conversion (§5.1.7) optionally followed by a widening reference conversion
an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2
*1:矢印は変換が起こる順番