“對於類型Y,方法X存在歧義” Java 歧義方法呼叫 null 錯誤

如果您正在閱讀這篇文章,很可能在終端機或任何Java IDE中編譯Java程序時遇到了The method X is ambiguous for the type Y的錯誤。

Java模糊方法調用

在這裡,我將通過一些示例解釋為什麼會出現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");
}

你將會得到編譯時錯誤,因為方法foo(Object)在類型Test中存在歧義,因為String和Integer類都將Object作為父類,且沒有繼承關係。因此,Java編譯器不會認為其中任何一個更具體,因此會出現方法歧義的調用錯誤。

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中歧義方法調用編譯器錯誤的任何疑慮,如果您想添加任何內容或者對此有疑問,請在下面評論。

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