В первом случае происходит расширение конверсии. Это можно увидеть при запуске утилиты "javap" (входит в JDK) в скомпилированном классе:
public static void main(java.lang.String[]);
Code:
0: iconst_ 5
1: istore_ 1
2: iload_ 1
3: i2l
4: invokestatic #6; //Method hello:(J)V
7: return
}
Очевидно, вы видите I2L, который является мнемоникой для расширяющейся инструкции байт-кода Integer-To-Long. См. Ссылку здесь .
А в другом случае, заменив «long x» на сигнатуру объекта «Long x», вы получите следующий код в методе main:
public static void main(java.lang.String[]);
Code:
0: iconst_ 5
1: istore_ 1
2: iload_ 1
3: invokestatic #6; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: invokestatic #7; //Method hello:(Ljava/lang/Integer;)V
9: return
}
Итак, вы видите, что компилятор создал инструкцию Integer.valueOf (int), чтобы поместить примитив в оболочку.