2013-10-29 15 views
0

null作为参数传递时,为什么调用类型为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

可能重复[为什么Java不允许超载美孚(对象...)与美孚(对象\ [\] )?](http://stackoverflow.com/questions/8838339/why-is-it-not-allowed-in-java-to-overload-fooobject-with-fooobject) –

+0

,因为它在层次结构上更接近 –

+0

作为除此之外,'void show(Object arr [])'会更习惯性地写为'void show(Object [] arr)' - 保持数组部分以及其余的类型信息。 –

回答

2

你必须要经过JLS找到确切的解释,但基本的原因是,这是最具体的方法签名被选中,而“空”作为一个更具体的匹配子比超。

// 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)

4

首先,需要注意的是null值转换为两个ObjectObject[]是很重要的,所以这两种方法都适用。那么这只是超负荷解决的问题。这是一个在section 15.12 of the JLS描述,并section 15.12.2.5特别会谈关于寻找“最具体的方法”,其中包括:

非正式的直觉是一种方法比另一种更具体的,如果用第一种方法处理的任何调用可以传递给另一个没有编译时类型错误。

,这里的话:中show(Object[])任何调用可以传递给show(Object)没有编译时错误类型,因此show(Object[])show(Object)更具体,因此重载决议采show(Object[])调用。

要调用show(Object)你只需要投的nullObject,从可应用于停止show(Object[])方法:当多个候选匹配

ss.show((Object) null); 
0

最具体的签名将被选择。 Object[]Object,因此它更具体,其中Object是更通用的。

例如,如果您添加了show(Integer[])那么这将是最具体的候选人,并将通过show(Object[])进行选择。如果您同时添加了show(Integer[])show(String[]),那么您将收到编译时错误,指定show(Object)不明确,因为这两个新添加的方法都是您尝试创建的调用的候选对象。

如果你想迫使呼叫show(Object)代替,那么你可以写:show((Object)null);