使用参数null 重载方法调用

可能重复:
方法重载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); } } 

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

介绍是相当具体的:

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

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

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

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

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

null的值与ObjectString匹配,但StringObject的子类,因此选择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); } } 

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

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

 m1((String)null); 

通过执行此操作,您可以确保调用方法的正确重载版本。

您必须设置null类型以告诉Java您要调用哪个函数。

所以你这样做: m1((Object) null); 使用Object参数调用实现,然后执行m1((String) null); 打电话给另一个。

1.由于String也是一个对象JVM困惑运行时调用哪个方法。

2.如果要指定在运行时调用哪个方法,可以通过显式转换来执行此操作

例如:

 m1((String)null);