“类型Y的方法X存在歧义” Java 歧义方法调用空指针错误

如果您正在阅读此消息,很有可能在终端或任何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编译器的方法选择就很容易。

对于类型Y,方法X是模糊的。

现在让我们向上述代码添加以下方法。

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

当您调用foo(Object)时,将会得到编译时错误,因为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