문제

나는 이에 다른 질문에 대한 답변, 에서 참조하는 단점을 자바의 사양:

더 많은 결과는 이 미묘한 주제입니다.체크 아웃:

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top