7

爲什麼下面的程序會拋出異常?SCJP問題:使用var-args重載Java方法。基本原理是什麼?

public class MainClass{ 
    public static void main(String[] argv){ 
     callMethod(2); 
    } 
    public static void callMethod(Integer... i){ 
     System.out.println("Wrapper"); 
    } 
    public static void callMethod(int... i){ 
     System.out.println("Primitive"); 
    } 

}

方法callMethod(整數[])是不明確的類型MainClass

行,我可以看到,這兩種方法的將工作(如果其他的被註釋掉了),但是我也知道,如果一個原語與一個方法的輸入類型不完全匹配,會發生什麼。

嘗試的第一件事是擴大原語。所以,如果還有第三個方法:

 public static void callMethod(long i){ 
     System.out.println("long"); 
     } 

的代碼將打印

的第二件事是框原始。所以如果有一個採用整數的方法,那將是一個被調用的方法。

第三個優先級是var-args。

根據上述優先級,我認爲第二個可能性是這種情況。我期望int被包裝成一個Integer並且(Integer ...)將被調用。但是,這當然不會發生。相反,拋出異常。

有沒有人看到並可以解釋爲什麼優先級不適用於此示例?

乾杯!

回答

9

你說得對,在拳擊之前就會加寬,而這又會在var-args之前出現。

但是,您似乎將第一種方法視爲callMethod(Integer i)而不是callMethod(Integer... i)。由於這兩種方法都使用var-args,因此優先級爲。也就是說,沒有一個單獨符合拳擊標準,但都符合var-args的標準。

請記住,擴大,然後框是非法的(雖然我發佈了這個答案之前做了一些研究,發現它是合法的框,然後加寬)。同樣,你不會得到框,然後var-args的行爲;編譯器跳到var-args步驟的右邊,看到兩個採用var-args的方法。

編輯:我應該澄清,如果沒有歧義,你會得到box-then-var-args行爲。換句話說,如果只有一個callMethod(),並且它花了Integer... i,則會得到「Wrapper」。

+0

我有點認爲它嘗試了三種方法,第一個是「invocable」將被調用。雖然該方法採取(整數...我),我有點期待拳擊整數將使該方法「invocable」。但是,正如你所說,似乎後來的「變異性」也被考慮在內。乾杯! – 2010-02-23 21:59:50

相關問題