可能重复:
Overloaded method selection based on the parameter’s real type
How is an overloaded method choosen when a parameter is the literal null value?
当我执行下面的代码时,我得到以下输出:
带有String参数的方法被调用...“
为什么?
public class StringObjectPOC {
public static void test(Object o) {
System.out.println("Method with Object argument Called ...");
}
public static void test(String str){
System.out.println("Method with String argument Called ...");
}
public static void main(String[] args) {
StringObjectPOC.test(null);
}
}
答案 0 :(得分:3)
调用中的null
与test()签名匹配。您必须投射null
以确保它调用其中一个。
答案 1 :(得分:2)
如果我没记错的话,类似的例子来自 Java Puzzles 。
null
可以是String
类型或Object
类型。但是JVM总是会选择更强大的准确方法。
在这种情况下,String
更加准确,然后Object
。 (String
是Object
,但Object
可能不是String
。
编写这样的代码不是一个好习惯。尝试投射参数以匹配您想要的方法,例如
public class StringObjectPOC {
public static void test(Object o) {
System.out.println("Method with Object argument Called ...");
}
public static void test(String str){
System.out.println("Method with String argument Called ...");
}
public static void main(String[] args) {
StringObjectPOC.test((Object)null);
}
}
答案 2 :(得分:1)
Java尝试找到可以调用的最具体方法。 String是对象的子类,因此只要可能,Java就会遵循String方法。对于Object或String,null是一个完全可接受的值,但由于String比Object更具体,因此Java遵循String方法,因为它更精确。
答案 3 :(得分:1)
我试过了:
<强> Test2.class 强>
public class Test2{}
<强> Test3.class 强>
public class Test3 extends Test2{
}
<强>的Test.class 强>
public class Test{
public static void print(Object obj){
System.out.println("Object");
}
public static void print(Test2 obj){
System.out.println("test 2");
}
public static void print(Test3 obj){
System.out.println("Test 3");
}
public static void main(String[]args){
Test.print(null);
}
}
打印出测试3
就像您的场景一样,这意味着如果方法被重载(并且传递null),它会识别具有 child -most参数的方法。
Object->Test->Test2
或在你的情况下:
Object->String
答案 4 :(得分:0)
null
可以是String
和/或Object
但由于String
继承自Object
,它会尝试使用签名更准确。您可以强制null
选择要执行的方法:
public static void main(String[] args) {
Test.test((Object) null); // treats as Object
Test.test((String) null); // treats as String
Test.test(null); // treats as String
}