2015-10-15 30 views
1

鑑於代碼:如果參數匹配多個方法簽名,將定義什麼方法被調用?

public static void main(String[] args) 
{ 
    doSomething(new ArrayList()); 
} 

public static void doSomething(Collection collection) { 
    System.out.println("Collection here!"); 
} 

public static void doSomething(List list) { 
    System.out.println("List here!"); 
} 

此打印出List here!如預期,但在Java規範定義的地方,所以我可以依靠它這種行爲,因爲任何Java實現?

+1

它調用最具體的方法(我敢肯定,這是一個重複) – JonK

+1

是的,它是在[JLS](HTTPS定義: //docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.2)。 – Eran

+1

即使行爲是明確的,恕我直言,你不應該依賴它。要麼兩個重載版本對相同的參數做同樣的事情,要麼不使用重載。 –

回答

0

甚至還有更有趣的現象:

public static void main(String[] args) 
{ 
    Collection myCollection = new ArrayList(); 
    doSomething(myCollection); 
} 

public static void doSomething(Collection collection) { 
    System.out.println("Collection here!"); 
} 

public static void doSomething(List list) { 
    System.out.println("List here!"); 
} 

這將在這裏打印收藏!

+2

這是否回答這個問題?這只是對行爲的觀察。 – resueman

+0

這不是預期的行爲? –

+0

是的,它是預期的行爲。不,它並沒有回答這個問題,因爲其他人已經說過,選擇了最具體的方法。我認爲我會強調它是早期的,而不是延遲/多態。 –

相關問題