【问题标题】:How does overload resolution work with a null argument?重载解析如何处理空参数?
【发布时间】:2013-10-29 07:16:19
【问题描述】:

null作为参数传递时,为什么调用带有Object[]类型参数的方法而不是带有Object类型参数的方法?

class Demo {
    void show(Object arr[]) {
        System.out.println("khawar");
    }

    public void show(Object o) {
        System.out.println("aleem");
    }

    public static void main(String[] args) {
        Demo ss=new Demo();
        ss.show(null);
    }
}

【问题讨论】:

标签: java


【解决方案1】:

首先,重要的是要注意null 值可以转换为ObjectObject[],因此这两种方法都适用。那么这只是一个重载决议的问题。这在section 15.12 of the JLS 中有描述,section 15.12.2.5 特别谈到了寻找“最具体的方法”,其中包括:

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

这里就是这种情况:任何show(Object[]) 的调用都可以传递给show(Object) 而不会出现编译时类型错误,因此show(Object[])show(Object) 更具体,因此重载决议选择show(Object[]) 来调用.

要调用show(Object),您只需将null 强制转换为Object,以阻止show(Object[]) 方法的适用:

ss.show((Object) null);

【讨论】:

    【解决方案2】:

    您必须通过 JLS 才能找到确切的解释,但基本上原因是,选择了最具体的方法签名,并且“null”作为子类比超类更具体的匹配。

    // Where Subclass extends Middleclass extends Superclass
    public void method(Superclass c) {}
    public void method(Middleclass m) {}
    public void method(Subclass s) {}
    

    在上述情况下,对method(null) 的调用将调用method(Subclass s)

    【讨论】:

      【解决方案3】:

      当匹配多个候选人时,将选择最具体的签名。 Object[] Object,因此Object 更通用的地方更具体。

      例如,如果您添加了show(Integer[]),那么这将是最具体的候选人,并且将被选中而不是show(Object[])。如果您同时添加了show(Integer[])show(String[]),那么您将收到一个编译时错误,指定show(Object) 不明确,因为这两种新添加的方法对于您尝试进行的调用具有相同的特异性。

      如果你想强制调用show(Object),那么你可以写:show((Object)null);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-05
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        相关资源
        最近更新 更多