2017-09-16 4 views
-1
public class CompilerConfuse { 

    public static void main(String[] args) { 

     A a =new A(); 
     a.method(null); // error line 

    } 

} 


class A 
{ 

    public void method(Integer a) 
    { 
     System.out.println("In Integer argument method" + a); 
    } 

    public void method(Object a) 
    { 
     System.out.println("In Object argument method" + a); 
    } 

    public void method(String a) 
    { 
     System.out.println("In String argument method " + a); 
    } 
} 

Integer 및 String 오버로드 메서드에서 컴파일러는 어느 것을 호출 할 것인지 결정할 수 없었습니다. 왜 이런 일이 발생합니까?왜 컴파일러가 Java 코드 컴파일에 혼란 스러운가

String 또는 Integer 오버로드 메서드를 제거하면 null을 전달할 때 오류가 발생하지 않습니다.

+1

과부하가 예상됩니까? 이것은 * 애매합니다. – Carcigenicate

답변

-1

컴파일러는 전달 된 인수의 유형에 따라 가장 구체적인 방법을 선택합니다.
StringIntegerObject보다 구체적이지만 둘 다 매우 구체적이므로 컴파일러는 컴파일 오류를 선택하지 않고 컴파일 오류를 내 보냅니다. 당신은 15.12.2.5. Choosing the Most Specific Method을 참조 할 수 있습니다

:

최대한 특정 두 개 이상의 방법이 있기 때문에 어떤 방법이 가장 구체적인 없다고 할 수있다. 이 경우 :

모든 최대한 구체적인 방법은 우선 동등한 서명 (§8.4.2)가있는 경우 :

...

그렇지 않으면, 메소드 호출이 모호하고,을 a 컴파일 시간 오류가 발생합니다.