编译器为什么在编译Java代码时感到困惑

时间:2017-09-16 17:31:59

标签: java overloading

public class CompilerConfuse {

    public static void main(String[] args) {

        A a =new A();
        a.method(null); // error line

    }

}


class A
{

     public void  method(Integer a)
     {
         System.out.println("In Integer argument method" + a);
     }

     public void  method(Object a)
     {
         System.out.println("In Object argument method" + a);
     }

     public void  method(String a)
     {
         System.out.println("In String argument method " + a);
     }
}

在Integer和String重载方法中,编译器无法决定调用哪一个。为什么会发生这种情况?

如果我们删除String或Integer重载方法,则在传递null时不会出错。

1 个答案:

答案 0 :(得分:-1)

编译器根据传递的参数的类型选择最具体的方法 在您的情况下,StringIntegerObject更具体,但两者都具体,因此编译器不会在两者之间进行选择并发出编译错误。

您可以参考15.12.2.5. Choosing the Most Specific Method

  

可能没有方法是最具体的,因为有   两种或多种最具体的方法。在这种情况下:

     

如果所有最大特定方法都具有覆盖等效方法   签名(§8.4.2),然后:

     

...

     

否则,方法调用不明确,编译时   发生错误。