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时不会出错。
答案 0 :(得分:-1)
编译器根据传递的参数的类型选择最具体的方法
在您的情况下,String
和Integer
比Object
更具体,但两者都具体,因此编译器不会在两者之间进行选择并发出编译错误。
您可以参考15.12.2.5. Choosing the Most Specific Method:
可能没有方法是最具体的,因为有 两种或多种最具体的方法。在这种情况下:
如果所有最大特定方法都具有覆盖等效方法 签名(§8.4.2),然后:
...
否则,方法调用不明确,编译时 发生错误。