我在一些代码中找到了一个位置,我正在将null
转换为Object
,因为它被传递给方法。
为什么要这样做?
我知道this question处理重载方法,并使用强制转换来确定要调用哪个版本的方法。
但是如果没有执行强制转换,如果使用null参数调用该方法,是否不会选择使用类型为Object
的参数的重载方法而不是该方法的任何其他匹配版本?那么演员还能做些什么?
答案 0 :(得分:39)
如果演员不,则会选择最具体的版本。
null
可以是String
类型或Object
类型的空引用。因此,如果这两种方法可用,则将调用String
方法。
如果您的方法包含Object
,Integer
和 String
,那么使用null
(并且没有强制转换)调用该方法会产生汇编错误,因为Integer
和String
都有效且同样具体(即没有一个是另一个的专业化)。在这种情况下,您拥有来投射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'没有类型 - 你会收到编译错误。