使用具有null值的相同arity调用两个方法

时间:2011-11-09 08:45:11

标签: java

方法:

 public void doSomething(mObject1 ob){
 //Code A
 }

 public void doSomething(mObject2 ob){
 //Code B
 }

调用时执行的代码是什么?为什么?

doSomething(null);

5 个答案:

答案 0 :(得分:4)

对于重载方法,调用具有最多特定参数类型的方法。否则,如果没有方法获胜,则认为它是不明确的并且是编译器错误。

如果您想传递null,可以通过转换null表达式或将其指定给变量来选择所需的方法。

doSomething((MObject1)null);
doSomething((MObject2)null);

MObject1 m1 = null;
doSomething(m1);
MObject1 m2 = null;
doSomething(m2);

在您的示例中,如果MObject1MObject2的子类型,反之亦然,那么它应该编译。

(我正确地正确地将类型名称大写,因为这是正确的事情。)

答案 1 :(得分:4)

这取决于。如果mObject1mObject2中的一个是另一个的子类型,则根据Java Language Specification 15.12.2.5选择最具体的方法。

如果它们不通过继承相关,则方法调用被认为是不明确的,并且会导致编译器错误。

答案 2 :(得分:2)

你不能用null参数调用doSomething。 编译器会抱怨。在所有其他情况下,方法的签名是匹配的。但是这将起作用:

doSomething((mObject1 )null);

答案 3 :(得分:1)

它会变成模糊的调用编译时错误

答案 4 :(得分:1)

这是编译器错误。 但是,如果一个方法参数是class而另一个是原始数据类型,那么结果将会改变。

〜Dheeraj