2016-08-28 3 views
0

어떤 오버로드 된 메서드가 아래 메서드에 대해 호출되고 ?Ambigious 오버로드 된 메서드에 null 전달

이 코드를 실행하고 List로 오버로드 된 메서드를 호출하지만 은 왜 발생합니까?

public class AmbigiousOverload { 

    public static void add(Object o) { 
     System.out.println("Overloaded method with Object."); 
    } 

    public static void add(List l) { 
     System.out.println("Overloaded method with List."); 
    } 

    public static void main(String[] args) { 
     add(null); 
    } 

} 

출력 모든 List 구현 Object 서브이다 같이 List 과부하 가장 정확 매칭 과부하 때문에 Overloaded method with List.

+0

"어느 오버로드 된 메서드가 호출 될지"당신은 어느 쪽인지 알고 있습니다. 그것은 당신의 질문입니다. –

답변

1

List 과부하라고한다. JLS Sec 15.12.2.5에서

:

비공식 직관은 첫 번째 방법에 의해 취급 된 호출이 컴파일 타임 오류없이 다른 하나에 전달 될 수 있다면 하나 개의 방법이 다른 것보다 더 구체적인 것입니다.

당신이 add(List)에 전달할 수있는 매개 변수는 add(Object)에 전달 될 수 있기 때문에

, add(List)은 더 구체적이다. 따라서 null을 둘 다 전달할 수 있으므로 더 구체적인 방법이 선택됩니다.

ListString이 "동등하게"특정이기 때문에 add(String) 오버로드가있는 경우 컴파일되지 않습니다. (또는 다른 클래스 : String 일 필요는 없습니다.)

+0

'List'는'Object'에 대해 어떻게 특정 된 것으로 간주됩니까? 'List'는 클래스가 아니라 인터페이스입니다. –

+0

모든'List' 구현체는'Object'입니다. –

관련 문제