2009-08-24 44 views
4

section 15.12.2.5 of the Java Language Specification,它談論如何選擇最具體的方法在具有固定元數的方法和變量元數的方法(即varargs)兩種情況。既固定/可變元數的(可變參數)的比賽最具體方法

但是我在JLS中找不到的是關於決定兩種方法之間的任何事情,其中​​其中一個是固定參數,另一個是可變參數。例如:

public interface SomeApi { 
    public String getSomething(String arg);  // method 1 
    public String getSomething(String ... args); // method 2 
} 

編譯就好正如人們所預料(下面的號Yoni列出的原因)。這調用代碼也編譯:

SomeApi api = ... 
Object o = api.getSomething("Hello"); 

,如果你運行它,method #1(即非可變參數方法)被調用。爲什麼這個調用代碼不含糊?爲什麼固定方法比變量方法更具體?有人能指點我的規格的相關位?

+1

只是好奇...你有認識的,除了學術興趣特定的原因是什麼? (我試圖實現運行時調度選擇+想知道還有誰可能會這樣做) – 2011-05-16 21:08:35

回答

10

第一種方法解決階段只考慮固定元數的方法如果在找到任何可變參數方法之前發現匹配,則該過程終止。

http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2

15.12.2.2第1階段:確定匹配元數方法適用的 亞型

如果沒有找到適用的子類型 方法,適用的 方法搜索與繼續階段2 (§15.12.2.3)。 否則,通過子類型,在可應用 的方法中選擇最具有 特定方法(§15.12.2.5) 。

(我的重點。)

+0

中澄清了我的意圖。謝謝亞歷克斯 - 我沒有看到樹木。該死的樹! – 2009-08-24 11:42:40

+1

那些可變參數被詛咒! – pjp 2009-08-24 11:44:29

-1

我不能指向你的規範,但在邏輯上,

getSomething(String...args) 

轉化爲

getSomething(String[] args) 

毫不含糊

+0

是的 - 我明白這一點。我在問爲什麼調用代碼不含糊 - 我已經在問題 – 2009-08-24 10:55:04