이것이 정말로 확대 대 autoboxing?
-
08-06-2019 - |
문제
나는 이에 다른 질문에 대한 답변, 에서 참조하는 단점을 자바의 사양:
더 많은 결과는 이 미묘한 주제입니다.체크 이 아웃:
public class methodOverloading{ public static void hello(Integer x){ System.out.println("Integer"); } public static void hello(long x){ System.out.println("long"); } public static void main(String[] args){ int i = 5; hello(i); } }
여기에서"길"것 인쇄(확인하지 않은 그것을 자신)기 때문에,컴파일러 선택을 확대상 자동 복싱습니다.주의해야 할 때 사용하는 자동 복싱이나 그것을 사용하지 않는다.
우리는 이것은 실제로는 예 확대하는 대신 autoboxing,또는 완전히 다른 무언가?
내 초기 검색,나는 것에 동의하는 문 출력이 될 것이다"장"의 기초 i
로 선언되었을 기본이 아닌 객체입니다.그러나 변경한 경우
hello(long x)
하기
hello(Long x)
출력 print"정수"
정말 무엇일까요?나는 아무것도 모르는 대한 컴파일러/바이트 코드는 해석을 위한 java...
해결책
첫 번째 경우에,당신은 확대 변환이 일어나고 있다.이 될 수 있습니다 볼 때 우리는"은 javap"유틸리티 프로그램(포 w/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 는가에 대한 기억을 확대 정수장 바이트 코드는 명령입니다.참조를 참조하십시오 기.
과 다른 경우에는,교체"long x"object"Long x"서명은,당신은 이 코드에서는 주요 방법:
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
}
을 볼 수 있도록 컴파일러를 만들었르침의 정수입니다.valueOf(int),하자의 기본 내부 래퍼입니다.
다른 팁
네,그것은,그것을 밖으로 시도 테스트에서.당신이 볼 것이다"장"인쇄했습니다.그것은을 확대하기 때문에 자바를 선택할 것을 넓혀 int 으로 오래 전에 그것을 선택하는 자동 박스에 그것의 정수,그래서 안녕하세요(오)방법이 선택 호출됩니다.
편집: 원래 참조되는 게시물.
더 편집:이유는 두 번째 옵션은 인쇄의 정수가 없기 때문에"확대"으로 더 큰 기본 옵션으로,그래서 그 상자는,그것을 따라서 정수가 유일한 옵션입니다.또한,java 만 자동 박스는 원래 유형,그래서 그것은 주 컴파일러에 오류가 당신을 떠나 안녕하세요(오)및 제거 안녕하세요(정수).
또 다른 흥미로운 것은 이 예는 방법을 합니다.조합의 유형을 확대 및 방법은 과부하 작업하기 때문에 컴파일러를 만들의 의사 결정하는 방법을 선택할 수 있습니다.다음 예제를 살펴보겠습니다.
public static void hello(Collection x){
System.out.println("Collection");
}
public static void hello(List x){
System.out.println("List");
}
public static void main(String[] args){
Collection col = new ArrayList();
hello(col);
}
그것은 사용하지 않는 실행 시간 입력하는 목록에 그것을 사용하여 컴파일 시간 형식은 컬렉션과 따라서 인쇄"모음"입니다.
저는 격려를 읽 효과적인 자바, 는 내 눈을 몇 가지 모퉁이의 경우 JLS.