자바 1.5에서 auto-boxing과 auto-unboxing을 제공하여, 타입 측면에서는 차이가 없이 사용할 수 있다. (컴파일 타임에 확인 가능)
코드와 바이트코드
public class Runner {
public static void main(String[] args) {
// TODO Auto-generated method stub
Runner r = new Runner();
int num = 1;
Integer numObj = Integer.valueOf(1);
System.out.println(numObj.intValue());
r.getInt(num);
r.getInt(numObj);
r.getInteger(num);
r.getInteger(numObj);
}
void getInt(int num) {
System.out.println("hello" + num);
}
void getInteger(Integer num) {
System.out.println("hi" + num);
}
}
public class Runner {
public Runner();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class Runner
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: iconst_1
9: istore_2
10: iconst_1
11: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
14: astore_3
15: aload_1
16: iload_2
17: invokevirtual #5 // Method getInt:(I)V
20: aload_1
21: aload_3
22: invokevirtual #6 // Method java/lang/Integer.intValue:()I
25: invokevirtual #5 // Method getInt:(I)V
28: aload_1
29: iload_2
30: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
33: invokevirtual #7 // Method getInteger:(Ljava/lang/Integer;)V
36: aload_1
37: aload_3
38: invokevirtual #7 // Method getInteger:(Ljava/lang/Integer;)V
41: return
void getInt(int);
Code:
0: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iload_1
4: invokedynamic #9, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
9: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
void getInteger(java.lang.Integer);
Code:
0: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_1
4: invokedynamic #11, 0 // InvokeDynamic #1:makeConcatWithConstants:(Ljava/lang/Integer;)Ljava/lang/String;
9: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
12: return
}