2011-11-09 61 views
1

相同元數對於方法:調用兩種方法與空值

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

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

請告訴我執行的代碼調用,爲什麼當?

doSomething(null); 
+3

這甚至不會編譯 –

+0

@Adrmedi:編譯看看。 –

+0

它可能編譯... –

回答

2

你不能調用DoSomething的帶有null參數。 編譯器會投訴。在所有其他情況下,該方法的簽名是匹配的。但是,這將起作用:

doSomething((mObject1)null); 
1

它會成爲ambigious調用編譯時錯誤

4

對於重載的方法,用最具體的參數類型的一個被調用。否則,如果沒有方法獲勝,則認爲它是不明確的,並且是編譯器錯誤。

如果您想通過null,您可以通過投射null表達式或將其分配給變量來選擇所需的方法。

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

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

在你的榜樣,如果MObject1MObject2反之亦然亞型,那麼它應該編譯。

(我是正確的正確大寫類型的名稱,因爲這是做正確的事。)

+0

所以非常*正確! –

4

這取決於。如果mObject1mObject2之一是另一個的子類型,則根據Java Language Specification 15.12.2.5選擇最具體的方法。

如果它們通過繼承不相關,則該方法調用被認爲是不明確的,並且會導致編譯器錯誤。

1

這是編譯器錯誤。 但是,如果一個方法參數是類而另一個是原始數據類型,那麼結果將會改變。

〜Dheeraj