2011-06-25 49 views
1
class OverloadingVarargs2 { 
    static void f(float i, Character... args) { 
     System.out.println("first"); 
     System.out.println(i); 
    } 
    static void f(Character... args) { 
     System.out.println("second"); 
    } 
    static void test() { 
     f(1, 'a'); 
     f('b', 'c'); // the method f is ambiguous 
    } 
} 

這段代碼不能被編譯,編譯器說f是不明確的。但我認爲第二種方法可以匹配f('b', 'c');有什麼問題?用變量參數重載

回答

8

這是因爲無法確定該方法調用是應該調用帶有變量args的調用還是帶有float和變量args的調用。

Java決定用這種方法調用擴展> boxing>變量args,但是在這種情況下,它們都有可變參數。

在這種情況下,基本上char被加寬浮動。

爲Java原始加寬順序是:

byte -> short -> int -> long -> float -> double 
char -> int -> long -> float -> double