在Java中重载方法中使用null
可能重复:
方法重载NULL参数
以下代码编译并正常运行。
public class Main { public void temp(Object o) { System.out.println("The method with the receiving parameter of type Object has been invoked."); } public void temp(String s) { System.out.println("The method with the receiving parameter of type String has been invoked."); } public void temp(int i) { System.out.println("The method with the receiving parameter of type int has been invoked."); } public static void main(String[] args) { Main main=new Main(); main.temp(null); } }
在此代码中,要调用的方法是接受String
类型的参数的方法
文档说。
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择最具体方法的规则。
但我不明白当代码中接受原语int
的参数的方法之一被修改为接受包装类型Integer
的参数时,如,
public void temp(Integer i) { System.out.println("The method with the receiving parameter of type Integer has been invoked."); }
发出编译时错误。
对temp的引用是不明确的,methodoverloadingpkg.Main中的方法temp(java.lang.String)和methodoverloadingpkg.Main中的方法temp(java.lang.Integer)匹配
在这个特定的场景中,为什么使用原始数据类型重载方法是合法的,但是对于相应的包装类型却不是这样呢?
如果你被问到什么是更专业的“字符串”或“对象”,你会怎么说? 显然是“字符串”,对吧?
如果有人问:什么是更专业的“字符串”或“整数”? 没有答案,它们都是对象的正交特化,你如何在它们之间做出选择? 那么你必须明确你想要哪一个。 例如,通过转换null引用:
question.method((String)null)
当您使用原始类型时,您没有那个问题,因为“null”是一个引用类型,不能与基本类型冲突。 但是当你使用引用类型时,“null”可以引用String或Integer(因为null可以转换为任何引用类型)。
请参阅上面评论中发布的其他问题中的答案,以获取更多更深入的详细信息,甚至是JLS中的一些引用。
如果将null
作为重载方法的参数传递,则选择的方法是具有最特殊类型的方法,因此在这种情况下:选择String
而不是最容忍的: Object
。
在Object
/ String
/ int
中,编译器的选择是明确的:你将得到String
的一个原因, int
不能为null
,因此在这种情况下它的相应方法不适合被调用。
但是如果你为Integer
改变int
,编译器就会混淆,因为采用String
两个方法都和Integer
的方法一样准确(在层次结构中是正交的)。
并且编译器不能(不想要?^^)随机选择。
首先要了解为什么main.temp(null);
解析为temp(String s)
而不是temp(Object o)
我指向旧的回复Java方法dispatch with null参数 。 本质上,文字null
的类型为nulltype
, Object
< String
< nulltype
。 所以null
更接近于String
然后是Object
。
现在, null
与String
一样接近Integer
,因此当你添加test(Integer)
它变得模棱两可