웹사이트 검색

\방법 X는 유형 Y에 대해 모호합니다.\ Java 모호한 방법 호출 null 오류


이 글을 읽고 있다면 터미널이나 Java IDE에서 Java 프로그램을 컴파일할 때 The method X is ambiguous for the type Y 오류가 발생할 가능성이 있습니다.

Java 모호한 메서드 호출

여기에서 Java 모호한 메서드 호출 오류가 몇 가지 예와 함께 제공되는 이유를 설명하겠습니다. 이 모호한 메서드 호출 오류는 항상 컴파일러가 오버로드된 메서드 중 어떤 메서드를 사용해야 하는지 찾지 못하는 메서드 오버로드와 함께 발생합니다. 아래와 같은 자바 프로그램이 있다고 가정합니다.

package com.journaldev.errors;

public class Test {

	public void foo(Object o) {
		System.out.println("Object");
	}

	public void foo(String s) {
		System.out.println("String");
	}
	public static void main(String[] args) {
		new Test().foo(null);
	}

}

위의 프로그램은 완벽하게 컴파일되고 실행할 때 "String\을 인쇄합니다. 따라서 foo(String s) 메소드가 프로그램에 의해 호출되었습니다. 그 이유는 Java 컴파일러가 다음을 찾으려고 시도하기 때문입니다. 메소드를 호출하기 위한 가장 구체적인 입력 매개변수가 있는 메소드. 우리는 Object가 String의 상위 클래스라는 것을 알고 있으므로 선택이 쉬웠습니다. 다음은 Java 언어 사양에서 발췌한 것입니다.

둘 이상의 멤버 메서드가 액세스 가능하고 메서드 호출에 적용 가능한 경우 … Java 프로그래밍 언어는 가장 구체적인 메서드가 선택된다는 규칙을 사용합니다.

"null\을 전달하는 이유는 모든 유형의 인수에 대해 작동하기 때문입니다. 다른 개체를 전달하면 Java 컴파일러에 대한 메서드 선택이 쉽습니다.

메서드 X는 유형 Y에 대해 모호합니다.

이제 위의 코드에 아래 메소드를 추가해 보겠습니다.

public void foo(Integer i){
	System.out.println("Integer");
}
package com.journaldev.strings;

public class Test {

	public void foo(Object o) {
		System.out.println("Object");
	}

	public void foo(Exception e) {
		System.out.println("Exception");
	}

	public void foo(NullPointerException ne) {
		System.out.println("NullPointerException");
	}

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

}

위에서 설명한 것처럼 여기서 foo(NullPointerException ne)는 Exception 클래스에서 상속되었기 때문에 가장 구체적인 메서드이므로 이 코드는 잘 컴파일되고 실행 시 "NullPointerException\이 인쇄됩니다. Java 모호한 메소드 호출 컴파일러 오류가 있습니다. 무언가를 추가하고 싶거나 혼동이 있는 경우 의견을 말하십시오.