アンボクシングのち拡大変換

変数に値を代入する際に、アンボクシング→プリミティブ拡大変換は起こる*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:矢印は変換が起こる順番