2013-08-19 25 views
2

任何人都可以請解釋爲什麼這段代碼會引發一個模糊的過載錯誤,當然整數方法更具體和適用?Var-args overloading

感謝,

斯內德

package object_orientation; 
public class Ambiguous { 
    //ambiguous error compiler unsure whether boxing is needed or not 
    static void overload(Integer... d){ 
     System.out.println("Integer"); 
    } 

    static void overload(long... d){ 
     System.out.println("Long"); 
    } 

    public static void main(String a[]){ 
     int i = 1; 
     overload(i); 
    } 
} 
+1

看到「整數」與「int」不同。 Integer是一個包裝。 – fpe

+1

好帖子在此 - http://stackoverflow.com/questions/2521293/b​​ug-with-varargs-and-overloading –

+1

如果你在你的重載方法中將'long ...'更改爲'long',它將會被編譯。我相信可變參數在編譯時轉換爲數組,所以我認爲這就是模糊發生的地方 –

回答

3

在Java中這些概念應該幫助, Boxing + Widening is allowed,但not Widening + Boxing

加寬的這些規則,拳擊和可變參數應該有所幫助:

  1. 原始強化>拳擊>可變參數。
  2. 加寬和拳擊(WB)不允許。
  3. 允許拳擊和加寬(BW)。
  4. 雖然超載,Widening +可變參數和Boxing +可變參數只能是 以互斥方式使用
  5. 不允許在包裝類之間加寬。
  6. 加寬+ varArgs &單獨允許裝箱+可變參數(但在重載版本的方法中不允許)。
  7. 拳擊+加寬比拳擊+可變參數更受歡迎。

希望這會有所幫助。

+0

謝謝。我認爲int會被簡單地裝箱並應用到Integer var-args並忽略長的var-args,因爲你不能同時擴大和放置。編譯器告訴我,我有一個模棱兩可的錯誤類型曖昧 – Xivilai

+1

當然,NP。很高興幫助。您可以通過接受答案來解決問題。謝謝 – JNL