为什么将null转换为Object?

时间:2011-04-27 14:57:06

标签: java null

我在一些代码中找到了一个位置,我正在将null转换为Object,因为它被传递给方法。

为什么要这样做?

我知道this question处理重载方法,并使用强制转换来确定要调用哪个版本的方法。

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

4 个答案:

答案 0 :(得分:39)

如果演员,则会选择最具体的版本。

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

如果您的方法包含ObjectInteger String,那么使用null(并且没有强制转换)调用该方法会产生汇编错误,因为IntegerString都有效且同样具体(即没有一个是另一个的专业化)。在这种情况下,您拥有来投射null以指定要调用的方法。

答案 1 :(得分:14)

Object方法”始终是所有“适用方法”中的“最不具体”方法。这就是编译器不会选择它的原因。

如果你跑

String.valueOf(null);

然后编译器可以选择两个“适用的方法”。你实际上是在调用更具体的方法

String.valueOf((char[]) null);

哪个会给你一个NullPointerException。要调用另一个方法,请写

String.valueOf((Object) null);

在这种情况下,您只使用一个“适用方法”,因此您不会遇到“更具体”的不同重载方法的问题。

答案 2 :(得分:0)

虽然之前的答案已经解释了如果你将null转换为对象会发生什么,如果你没有将null转换为Object,但我仍然想添加一些缺失点。

所以在Java中,'arrays'是对象,这意味着它们可以被赋值给Object类型,即如果你new char[0].getClass().getSuperclass()它给出了java.lang.Object,因此如果null没有显式转换,编译器会选择{ {1}}超过valueOf(char[])作为最适用的方法。

然而,这里缺少部分,如果有另一个重载方法接受接口类型参数(记住接口不扩展Object类,所以它们也导致大多数模糊不清具体方法选择)例如valueOf(CharSequence)然后这将导致编译时错误(即对valueOf的引用是不明确的)因为编译器无法选择最适用的方法。

所以底线是避免传递raw null 作为方法的参数而是总是将它们转换为被调用方法的param类型。 :)

答案 3 :(得分:-2)

“但是如果未执行强制转换,如果使用null参数调用该方法,是否不会选择使用类型为Object的参数的重载方法而不是该方法的任何其他匹配版本?”

不,因为'null'没有类型 - 你会收到编译错误。