2012-01-27 50 views
-1

考慮下面的代碼:的Java可變參數方法的行爲不同

public class Main { 
    public static void main(String[] args) { 
     new CC().ff(1); 
    } 
} 

class CC { 
    public static void ff(int cc) { 
     System.out.println("bbbbb"); 
    } 

    public static void ff(int... ints) { 
     System.out.println("aaaaaaa"); 
    } 
} 

輸出將是:

aaaaaaa 

bbbbb 

如果我改變第三行CC.ff(1),輸出將是:

bbbbb 

有誰能告訴我爲什麼?

+0

你的第三個行*是*'新CC()FF(1);'。請張貼您的原始代碼,否則很難理解您的問題。順便說一句,你的代碼不能編譯:你的方法被稱爲'FF()',但你嘗試調用'FF()' – AlexR 2012-01-27 22:56:29

+1

我編輯你的代碼中調用'ff',而不是'FF',所以它至少編譯。我建議你再試一次,建立一個你想要解釋的簡單的repro例子,因爲這 - 即使它編譯 - 可能不是它。 – 2012-01-27 22:56:49

+1

看起來像示例代碼中缺少的東西。 – user949300 2012-01-27 22:57:47

回答

2

如果我讀什麼,我認爲是relevant section of the JLS正確的(它不完全輕睡前閱讀),找什麼方法調用使用該方法分三個階段發生,通過以下的方法集順序搜索:

  1. Matching Arity Methods Applicable by Subtyping
  2. Matching Arity Methods Applicable by Method Invocation Conversion
  3. Applicable Variable Arity Methods

在每種那些秒的提到如果在給定階段找到適用的方法,則從中選擇要調用的方法。只有當階段沒有產生適用的方法時,搜索纔會進入下一個階段。

由於可變的arity方法最後搜索,這意味着,任何匹配的方法是不變元數將被優先稱爲那些。

相關問題