2013-10-29 13 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);