为什么将null转换为Object?

我在一些代码中找到了一个位置,我正在处理将nullObject因为它被传递给方法。

为什么要这样做?

我知道这个问题涉及重载方法,并使用强制转换来确定要调用的方法版本。

但是如果未执行强制转换,如果使用null参数调用该方法,是否不会选择使用类型为Object的参数的重载方法而不是该方法的任何其他匹配版本? 那么演员还能完成什么呢?

如果演员表没有演出,那么将选择最具体的版本。

null可以是String类型或Object类型的null引用。 因此,如果这两个方法可用,则将调用String方法。

如果你有ObjectInteger String方法,那么用null (并且没有强制转换)调用它会产生编译错误,因为IntegerString都是有效的并且同样具体 (即没有一个是另一个的特化)。 在这种情况下,您必须转换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’没有类型 – 你会得到一个编译错误。