2011-04-27 137 views
21

我发现了一些代码,我正在处理null转换为Object,因为它传递给一个方法。为什么要将null转换为Object?

为什么要这样做?

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

但是,如果未进行铸造,将没有结束的方法的任何其他匹配的版本来选择一个重载方法与类型为Object一个参数,如果该方法是带一个空参数?那么演员还能完成什么?

+0

可能重复的[为什么null cast?](http://stackoverflow.com/questions/315846/why-null-cast) – 2014-04-16 14:51:46

回答

38

如果其中进行投,那么最具体版本将被选择。

null可以是String类型的空引用或Object类型的空引用。所以如果这两种方法都可用,那么将调用String方法。

如果你有方法与ObjectIntegerString然后调用与null(无投)将给出一个编译错误,因为IntegerString都是有效和同样具体(即没有一个的特殊化另一个)。在这种情况下,您将转换为null以指定要调用的方法。

+0

尽管我同意你的回答,但我相信第一条语句不正确,即如果多个方法适用,编译器总是尝试找到最具体的匹配项,例如,如果您将null转换为Integer并且重载方法分别使用Object类型和Number类型参数,然后它将解析为Number类型(即最具体的一个)。 – sactiw 2015-06-15 17:25:07

-2

“但如果不进行投,不会与类型为对象的参数的重载的方法来在方法的其他任何匹配版本选择,如果该方法是带一个空参数?”

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

+4

错误。只有你**,如果有多个“最具体”的过载周围,就会得到编译错误。 – 2011-04-27 15:00:29

+0

我假定他有不止一种方法,这是嵌入式问题。 – cbz 2011-04-27 16:00:23

14

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

如果运行

String.valueOf(null); 

那么编译器有两种“适用方法”的选择。你实际上叫更具体的方法

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

这将给你一个NullPointerException。为了调用其他方法,写

String.valueOf((Object) null); 

在这种情况下,你仍然只有一个“适用法”,这样你就不会有不同,重载的方法是“更具体”的问题。

+0

对于String.valueOf(Object o),+1是在所有可能的匹配中“最不具体”匹配。然而,如果没有完成特定的转换,那么在String的情况下,我们留下的“最具体的”匹配是'String.valueOf(Char [] c)',因此它会被调用。 **注意:** java编译器总是将重载的方法解析为具有“最具体”匹配的方法,如果它未能这样做,它会给'方法的引用是ambiguos'编译错误。 – sactiw 2015-06-15 16:30:33

+0

@sactiw:谢谢你的提示。是的,我错误地输入了char []与byte []'...... – 2015-06-15 17:04:07

0

虽然以前的答案已经解释了如果您将null转换为Object但如果不将null转换为Object,但我仍然希望添加几个缺失的点。

所以在Java中,'数组'是对象,这意味着它们可以被分配给对象类型即如果你做new char[0].getClass().getSuperclass()它给出java.lang.Object,因此,如果没有明确投出null,编译器选择valueOf(char[])而不是valueOf(Object)作为最适用的方法。

然而,来这里的缺失部分,此前,没有一个重载的方法这是接受接口类型参数(记得接口不继承对象类,所以他们也造成最具体的方式选择歧义)如valueOf(CharSequence)则会导致编译时错误(即对valueOf的引用不明确),因为编译器无法选择最适用的方法。

因此,底线是避免将原料空作为方法的参数,而总是将它们转换成参数类型的方法被调用。 :)

相关问题