“유형 Y에 대한 X 메서드의 사용이 모호합니다.” Java 모호한 메서드 호출 null 오류

만약 이것을 읽고 있다면, 아마도 터미널이나 Java IDE에서 자바 프로그램을 컴파일할 때 The method X is ambiguous for the type Y 오류가 발생했을 것입니다.

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) 메소드가 호출되었습니다. 그 이유는 자바 컴파일러가 메소드를 호출하기 위해 가장 구체적인 입력 매개변수를 가진 메소드를 찾으려고 하기 때문입니다. Object가 String의 부모 클래스임을 알기 때문에 선택은 쉬웠습니다. 여기 Java 언어 명세서에서의 발췌입니다.

만약 하나 이상의 멤버 메소드가 모두 접근 가능하고 적용 가능한 경우… 자바 프로그래밍 언어는 가장 구체적인 메소드가 선택됩니다.

나는 “null”을 전달하는 이유는 그것이 모든 종류의 인수에 대해 작동하기 때문입니다. 다른 객체를 전달하면 자바 컴파일러가 메소드를 선택하는 것이 쉬워집니다.

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

이제 위의 코드에 아래 메소드를 추가해 봅시다.

public void foo(Integer i){
	System.out.println("Integer");
}

String 및 Integer 클래스가 모두 Object를 부모 클래스로 가지고 있고 상속이 없기 때문에 컴파일 시간 오류가 발생합니다. 따라서 자바 컴파일러는 이들 중 어느 것도 더 구체적이라고 보지 않으므로 메소드가 모호하다는 오류가 발생합니다.

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”을 출력합니다. 이 글이 자바 모호한 메소드 호출 컴파일러 오류에 대한 의문을 해소해 드리기를 바랍니다. 무언가 추가하거나 혼란스러운 점이 있다면 의견을 남겨주세요.

Source:
https://www.digitalocean.com/community/tutorials/the-method-is-ambiguous-for-the-type-java-ambiguous-method-call-null-error