7

다음 프로그램이 예외를 throw하는 이유는 무엇입니까? 방법 callMethod은 (정수 [])이SCJP 질문 : var-args로 자바 메소드 오버로딩. 이유는 무엇입니까?

OK 타입 MainClass 대한 모호 I합니다 (만약 두 가지 방법 중 하나가 작동하는지 알 수

public class MainClass{ 
    public static void main(String[] argv){ 
     callMethod(2); 
    } 
    public static void callMethod(Integer... i){ 
     System.out.println("Wrapper"); 
    } 
    public static void callMethod(int... i){ 
     System.out.println("Primitive"); 
    } 

} 다른 것은 주석 처리되어 있습니다), 또한 프리미티브가 메소드의 입력 유형과 정확히 일치하지 않으면 어떻게 될지에 대한 계층 구조가 있다는 것을 알고 있습니다.

가장 먼저 시도되는 것은 프리미티브를 넓히는 것입니다.

 public static void callMethod(long i){ 
     System.out.println("long"); 
     } 

코드는

두 번째 것은 원시 박스입니다 인쇄 할 것이다 : 그래서, 경우 세 번째 방법이 있었다. 그래서 Integer를 취하는 메소드가 있다면 그것은 호출 된 메소드가 될 것입니다.

세 번째 우선 순위는 var-args입니다.

위의 우선 순위에 따라 두 번째 우선 순위가 예상됩니다. int가 Integer로 랩핑되고 (Integer ...) 호출 될 것이라고 예상합니다. 그러나 물론 이것은 일어나지 않습니다. 대신 예외가 발생합니다.

누구든지이 예제에서 우선 순위가 적용되지 않는 이유를보고 설명 할 수 있습니까?

건배!

답변

9

당신이 맞다면 차례 차례로 var-args 전에 오는 복싱 전에 온다.

는하지만 callMethod(Integer i)하지 callMethod(Integer... i)로 첫 번째 방법을 치료하는 것 같다. 두 방법 모두 var-args를 사용하기 때문에 우선 타이이 우선합니다. 즉, 어느 누구도 권투 기준 만 충족시키지 만 둘 다 var-args에 대한 기준을 충족시킵니다.

(나는이 대답을 게시하기 전에 몇 가지 조사를했고, 그 다음, 상자 넓혀 법적 것으로 나타났습니다 있지만) 그 상자가 다음 넓혀 불법 것을 기억하십시오. 마찬가지로 상자를 얻지도 않고 var-args 동작을 얻습니다. 컴파일러는 var-args 단계를 건너 뛰고 var-args를 취하는 두 가지 메소드를 봅니다.

편집 : 나는 모호함이 없다면 당신은 상자 - 다음 - VAR-인수 행동을 얻을 것이다 명확히해야한다. 즉, callMethod()이 하나만있는 경우 Integer... i이 걸리면 "Wrapper"이 표시됩니다.

+0

나는 3 가지 접근 방식을 시도하고 "호출 가능"한 첫 번째 호출이 시도 될 것이라고 생각했습니다. 이 메서드는 (Integer ... i) 걸리지 만 Integrity로 복싱하면 해당 메서드가 "호출 가능"하게됩니다. 그러나, 당신이 말했듯이, 이후의 "var-arg-ization"또한 고려 된 것 같습니다. 건배! –