【问题标题】:Passing null to the method preferring String, not Object将 null 传递给首选 String 而不是 Object 的方法
【发布时间】:2013-02-09 09:41:39
【问题描述】:

我在我的程序中遇到了一个问题,我用下面的小代码 sn-p 说明了这一点。谁能解释为什么会这样?

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

我想知道原因以便修改代码。

【问题讨论】:

标签: java string oop object


【解决方案1】:

请参阅 jls 的第 15.12.2.5 节,其中详细说明了如何选择它

在编译时选择最具体的方法

LINK TO THE JLS 15.12.2.5

【讨论】:

    【解决方案2】:

    我同意关于选择最具体方法的现有评论。您可以强制将您的 null 视为对象引用,从而消除使用 String 参数方法,通过强制转换:

    a.printToOut((Object)null);
    

    【讨论】:

      【解决方案3】:

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

      在编译时选择最具体的方法。

      因为“java.lang.String”是比“java.lang.Object”更特定类型。在您的情况下,选择了将“String”作为参数的方法。

      它在JLS中有明确记录:

      第二步搜索上一步确定的类型 成员方法。此步骤使用方法的名称和类型 用于定位可访问的方法的参数表达式 并且适用,即可以正确调用的声明 在给定的论点上。

      这样的方法可能不止一种,在 在这种情况下,选择最具体的一种。描述符(签名 加返回类型)最具体的方法是在运行时使用的方法 执行方法分派。

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多