传递null到方法宁愿字符串,而不是对象(Passing null to the method pr

2019-08-17 03:04发布

我在我的程序面临的一个问题,我做了下面一小段代码清晰。 任何人都可以解释为什么这是怎么回事?

class ObjectnullTest {

    public void printToOut(String string) {

        System.out.println("I am null string");
    }


    public void printToOut(Object object)

        System.out.println("I am  null object");
    }



class Test {

    public static void main(String args[]) {

        ObjectnullTest a = new ObjectnullTest();
        a.printToOut(null);

    }
}

这始终打印I am null string

我想知道的原因,这样我可以修改代码。

Answer 1:

这是因为方法的重载的情况下

最具体的方法是在编译时choosen。

为“java.lang.String中”是一个更具体类型不是“java.lang.Object中”。 在你的情况这需要“字符串”作为参数choosen方法。

它清楚地记录在JLS

第二步搜索在用于部件的方法的一步骤中确定的类型。 该步骤使用方法和类型参数的表达式的名称来查找既方便和适用的,也就是说,可以在给定的参数进行正确调用声明的方法。

可以存在多于一种这样的方法,在这种情况下选择最具体的一个。 最具体的方法的描述符(签名加返回类型)是一个在运行时用于执行所述方法的调度。



Answer 2:

我同意关于最具体方法的选择现有的注释。 你可以强迫你的空被视为一个对象引用,避免使用字符串参数的方法,通过铸造它:

a.printToOut((Object)null);


Answer 3:

请参阅JLS,在细节给第15.12.2.5如何选择

最具体的方法是在编译时choosen



文章来源: Passing null to the method preferring String, not Object