使用参数null重载方法调用

Sud*_*pta 16 java overloading

可能重复:
NULL参数的方法重载

在下面的代码输出是

如果我用类型参数删除方法,String那么输出是

宾语

我知道当参数类型不完全匹配时方法的重载如何起作用但我无法理解如何将null视为Object和/或String参数.

对此有何解释?

class C {

    static void m1(Object x) {
        System.out.print("Object");
    }
    static void m1(String x) {
        System.out.print("String");
    }

    public static void main(String[] args) {
        m1(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

mpr*_*vat 17

它总是根据Java规范使用最具体的方法,第15.12.2.5节.

介绍是相当具体的:

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

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

一般来说,至少在代码可读性方面,最好尽量做到尽可能明确.您可以将您null转换为与您要调用的签名匹配的类型.但这绝对是一个值得怀疑的做法.它假定每个人都知道这个规则并使代码更难以阅读.

但这是一个很好的学术问题,所以我给你的问题+1.

  • String或Object可以表示为null,对吗?因此,null可以表示任一类型,因此两个签名都匹配.但是因为String扩展了Object,所以String更具体,并且当调用不明确时,该方法被赋予优先权. (4认同)

das*_*ght 8

当多个重载与签名匹配时,Java会从中选择最具体的方法.

null匹配的值ObjectString,但是String是它的子类Object,因此String被选中.如果String在类层次结构中添加另一个带有兄弟的重载,则会出现编译错误.

// DOES NOT COMPILE
class C {
    static void m1(Object x) {
        System.out.print("Object");
    }
    static void m1(String x) {
        System.out.print("String");
    }
    static void m1(Integer x) {
        System.out.print("Integer");
    }
    public static void main(String[] args) {
        m1(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是一篇文章的链接,该文章详细讨论了您的代码示例.


Ósc*_*pez 5

如果在null作为参数传递时需要强制调用aprticular重载方法,则必须强制转换它,如下所示:

m1((String)null);
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以确保调用方法的正确重载版本.