6

可能重复:
基于参数的真实类型
的重载方法选择 当参数为文字空值时,如何选择重载方法?

当我执行下面的代码时,我得到以下输出:

带有字符串参数的方法称为 ..."

为什么?

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);
    }
}
4

5 回答 5

3

调用中的null匹配两个 test() 签名。您必须强制null转换以确保它调用一个或另一个。

于 2012-10-30T05:32:01.723 回答
3

如果我没记错的话,一个类似的例子来自Java Puzzles 。

null可以是String类型或Object类型。但是JVM总是会选择更准确的方法。

在这种情况下,String则更准确Object。(aString是 a Object,但 anObject可能不是 a 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);
    }
}
于 2012-10-30T05:34:20.180 回答
2

Java 试图找到可能调用的最具体的方法。String 是 object 的子类,因此 Java 将尽可能地遵循 String 方法。对于 Object 或 String,null 是完全可以接受的值,但由于 String 比 Object 更具体,Java 遵循 String 方法,因为它更精确。

于 2012-10-30T05:36:16.247 回答
2

我试过这个:

测试2.class

public class Test2{}

测试3.class

public class Test3 extends Test2{

}

测试类

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
于 2012-10-30T05:41:05.833 回答
1

nullis 可以是 aString和/或 anObject但是因为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
}
于 2012-10-30T05:36:53.920 回答