编译时错误:调用重载方法时不明确。为什么?

时间:2014-05-19 13:39:48

标签: java

对于下面的代码,为什么我会收到此编译时错误:

对于类型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");
    }

}

2 个答案:

答案 0 :(得分:6)

FileNotFoundExceptionArithmeticException在java对象层次结构中处于同一级别。编译器很难选择最具体的方法,因为这两种方法都有资格进行调用。

如果有多个对象层次结构,即使编译器也无法选择最具体的方法。因此,删除FileNotFoundExceptionArithmeticException无法解决问题。

来自JLS 15.12.2.5

  

如果多个成员方法都可访问且适用于a   方法调用,有必要选择一个提供   运行时方法调度的描述符。 Java编程   language使用选择最具体方法的规则。

     

非正式的直觉是一种方法更具体   如果可以传递第一个方法处理的任何调用,则为另一个   没有编译时类型错误的另一个。

答案 1 :(得分:1)

您有四个overloadedMethod版本,可接受IOExceptionFileNotFoundExceptionExceptionArithmeticException类型的参数。

致电时

test.overloadedMethod(null);

JVM无法知道您打算调用哪个版本的方法。这就是ambiguous错误的原因。

您需要更具体地说明要调用的版本。您可以通过转换参数:

来实现
test.overloadedMethod((IOException)null);