方法X对于类型Y存在歧义。Java存在方法调用不明确的空错误
如果您在阅读这篇文章,可能是因为在终端或任何Java集成开发环境中编译Java程序时遇到了类型Y的方法X存在歧义的错误。
Java模糊方法调用
这里我将解释为什么Java会出现模糊的方法调用错误,并举一些例子。模糊的方法调用错误通常出现在方法重载中,编译器无法确定应该使用重载的哪个方法。假设我们有一个如下的Java程序。
package com.Olivia.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");
}
你会因为Test类中的foo(Object)方法具有歧义而得到编译时错误,因为String和Integer类都将Object作为父类并且它们之间没有继承关系。因此,Java编译器不会将它们中的任何一个视为更加具体,从而导致这个方法具有歧义的调用错误。
package com.Olivia.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模棱两可的方法调用编译器错误有关的任何疑问,请在评论中添加您的观点或如有疑惑可提出。