Java歧义方法调用null错误 “The method X is ambiguous for the type Y"

时间:2020-02-23 14:34:42  来源:igfitidea点击:

Java模棱两可的方法调用

其中我将解释为什么Java歧义方法调用错误带有一些示例。
这种模棱两可的方法调用错误总是伴随着方法重载,而编译器无法找出应使用哪个重载方法。

假设我们有一个如下的Java程序。

package com.theitroad.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.theitroad.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"。