我知道以下程序会出现编译错误:
方法runThis(Integer)对于Other
类型不明确
我不明白的是原因。
public class Other {
public static void main(String[] args) {
runThis(null);
}
private static void runThis(Integer integer){
System.out.println("Integer");
}
private static void runThis(Object object){
System.out.println("Object");
}
private static void runThis(ArithmeticException ae){
System.out.println("ArithmeticException");
}
}
另外,当我按如下方式更改程序时,它会输出“ArithmeticException”。我也不知道原因。任何人都可以向我解释这个吗?
public class Other {
public static void main(String[] args) {
runThis(null);
}
private static void runThis(Exception exception){
System.out.println("Exception");
}
private static void runThis(Object object){
System.out.println("Object");
}
private static void runThis(ArithmeticException ae){
System.out.println("ArithmeticException");
}
答案 0 :(得分:9)
传入null
时,可以将其转换为任何引用类型。 Java将尝试使用最具体的类型查找重载方法。
在您的第一个示例中,可能性为Object
,Integer
和ArithmeticException
。 Integer
和ArithmeticException
都比Object
更具体,但两者都没有比另一个更具体,所以它不明确。
在您的第二个示例中,可能性为Object
,Exception
和ArithmeticException
。 Exception
和ArithmeticException
都比Object
更具体,但ArithmeticException
也比Exception
更具体,因此歧义有利于{{1} }}
答案 1 :(得分:5)
null
可以是任何Object
(包括Integer
)。添加一个演员,
更改此
runThis(null);
到
runThis((Integer) null);
或
runThis((Object) null);
消除歧义。