如果您正在阅读此消息,很有可能在终端或任何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模糊方法调用编译器错误的任何疑虑,如果您想添加或对此有疑问,请留言。