2011-03-27 1 views
3
public class Main { 
    public void testMethod(Object o){ 
     System.out.println("Object Method called"); 
    } 
    public void testMethod(String s){ 
     System.out.println("String Method called"); 
    } 

    public static void main(String[] args) { 
     new Main().testMethod(null); 
    } 
} 

이 프로그램은 마술처럼 String 메서드를 호출합니까? Java 컴파일러가 String 메소드를 사용하기로 결정한 기준은 무엇입니까? 누군가 제게이 이유를 가르쳐 주시겠습니까?Java는 다른 매개 변수 유형을 가진 동일한 이름의 메소드를 어떻게 결정합니까?

답변

12

컴파일러가 모든 일치에서 "가장 구체적인"오버로드를 선택한다는 규칙이 있습니다. 문자열 객체의 하위 클래스이기 때문에, 그 문자열 버전은 "더 구체적으로"하게하고, 따라서 그것은

+0

Object 메서드를 사용하려면 매개 변수를 Object로 캐스팅 할 수 있습니다. - 새 Main(). testMethod ((객체) null); –

2

Java 언어 사양의 수술 부분은 JLS 15.12.2.5입니다 : 하나 개 이상의 멤버 메소드는 메소드 호출에 접근 가능하고 적용 할 수있는 두 경우

", 런타임 방법 파견에 대한 설명을 제공하기 위해 하나를 선택하는 것이 필요하다. 자바 프로 문법 언어는 가장 구체적인 방법이 선택된다는 규칙을 사용합니다.

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

그런 다음 JLS는 가장 구체적인 메서드를 결정하는 방법에 대한 자세한 기술 사양을 제공하기 위해 진행합니다.

관련 문제