当Object[]
作为参数传递时,为什么调用类型为Object
的参数的方法而不是带有null
类型参数的方法?
class Demo {
void show(Object arr[]) {
System.out.println("khawar");
}
public void show(Object o) {
System.out.println("aleem");
}
public static void main(String[] args) {
Demo ss=new Demo();
ss.show(null);
}
}
答案 0 :(得分:4)
首先,请务必注意null
值可转换为Object
和Object[]
,因此这两种方法都适用于 。那么这只是一个过载解决的问题。 section 15.12 of the JLS中描述了这一点,section 15.12.2.5特别谈到了找到“最具体的方法”,其中包括:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体。
这就是这种情况:show(Object[])
的任何调用都可以传递给show(Object)
而没有编译时类型错误,因此show(Object[])
比show(Object)
更具体,所以重载决策选择show(Object[])
来调用。
要调用show(Object)
,您只需将null
强制转换为Object
,以阻止show(Object[])
方法适用:
ss.show((Object) null);
答案 1 :(得分:2)
您必须通过JLS才能找到确切的解释,但基本上原因是,选择了最具体的方法签名,而“null”则作为子类比超类更具体的匹配。
// Where Subclass extends Middleclass extends Superclass
public void method(Superclass c) {}
public void method(Middleclass m) {}
public void method(Subclass s) {}
在上述情况下,拨打method(null)
的电话会调用method(Subclass s)
。
答案 2 :(得分:0)
当匹配多个候选人时,将选择最具体的签名。 Object[]
是Object
,因此Object
更通用的更具体。
例如,如果您添加了show(Integer[])
,那么这将是最具体的候选人,并将选择show(Object[])
。如果您同时添加了show(Integer[])
和show(String[])
,那么您将收到一个编译时错误,指定show(Object)
是不明确的,因为这两个新添加的方法对您正在尝试的调用具有相同的特异性制作。
如果您想强制拨打show(Object)
,那么您可以写一下:show((Object)null);