为什么将null转换为Object?
我在一些代码中找到了一个位置,我正在处理将null
为Object
因为它被传递给方法。
为什么要这样做?
我知道这个问题涉及重载方法,并使用强制转换来确定要调用的方法版本。
但是如果未执行强制转换,如果使用null参数调用该方法,是否不会选择使用类型为Object
的参数的重载方法而不是该方法的任何其他匹配版本? 那么演员还能完成什么呢?
如果演员表没有演出,那么将选择最具体的版本。
null
可以是String
类型或Object
类型的null引用。 因此,如果这两个方法可用,则将调用String
方法。
如果你有Object
, Integer
和 String
方法,那么用null
(并且没有强制转换)调用它会产生编译错误,因为Integer
和String
都是有效的并且同样具体 (即没有一个是另一个的特化)。 在这种情况下,您必须转换null
以指定要调用的方法。
“ Object
方法”始终是所有“适用方法”中的“最不具体”方法。 这就是为什么编译器不会选择它。
如果你跑
String.valueOf(null);
然后编译器可以选择两个“适用的方法”。 你实际上是在调用更具体的方法
String.valueOf((char[]) null);
哪个会给你一个NullPointerException
。 为了调用其他方法,写
String.valueOf((Object) null);
在这种情况下,您只使用一个“适用的方法”,因此您不会遇到“更具体”的不同重载方法的问题。
虽然之前的答案已经解释了如果你将null转换为对象会发生什么,如果你没有将null转换为Object,但我仍然想添加一些缺失点。
所以在Java中,’arrays’是对象,这意味着它们可以被赋值给Object类型,即如果你执行new char[0].getClass().getSuperclass()
它会给出java.lang.Object
,因此如果null不是显式转换编译器选择valueOf(char[])
不是valueOf(Object)
作为最适用的方法。
但是, 这里缺少部分 ,如果有另一个重载方法接受接口类型参数( 记住接口不扩展Object类,因此它们也会导致大多数特定方法选择的歧义 )例如valueOf(CharSequence)那么这将有导致编译时错误(即对valueOf的引用是不明确的),因为编译器无法选择最适用的方法。
因此,底线是避免将原始null作为参数传递给方法,而是始终将它们转换为被调用方法的param类型。 🙂
“但是如果没有执行强制转换,如果使用null参数调用该方法,是否不会选择使用类型为Object的参数的重载方法而不是该方法的任何其他匹配版本?”
不,因为’null’没有类型 – 你会得到一个编译错误。