对于下面的代码,为什么我会收到此编译时错误:
对于类型Test,方法overloadedMethod(IOException)不明确。
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.overloadedMethod(null);
}
void overloadedMethod(IOException e) {
System.out.println("1");
}
void overloadedMethod(FileNotFoundException e) {
System.out.println("2");
}
void overloadedMethod(Exception e) {
System.out.println("3");
}
void overloadedMethod(ArithmeticException e) {
System.out.println("4");
}
}
答案 0 :(得分:6)
FileNotFoundException
和ArithmeticException
在java对象层次结构中处于同一级别。编译器很难选择最具体的方法,因为这两种方法都有资格进行调用。
如果有多个对象层次结构,即使编译器也无法选择最具体的方法。因此,删除FileNotFoundException
或ArithmeticException
无法解决问题。
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 language使用选择最具体方法的规则。
非正式的直觉是一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
答案 1 :(得分:1)
您有四个overloadedMethod
版本,可接受IOException
,FileNotFoundException
,Exception
和ArithmeticException
类型的参数。
致电时
test.overloadedMethod(null);
JVM无法知道您打算调用哪个版本的方法。这就是ambiguous
错误的原因。
您需要更具体地说明要调用的版本。您可以通过转换参数:
来实现test.overloadedMethod((IOException)null);