我正在學習Java,並且遇到了一些關於重載的問題。以下面的函數作爲例子:Java中的模糊重載
f('a', 'a');
如果我們有兩個定義:
static void f(int i, char j){
System.out.println("int_char");
}
static void f(double i, char j){
System.out.println("double_char");
}
這將是確定。因爲所有的第二個參數都完全匹配。但是第一個參數,他們都使用擴大。而且char的擴展順序是:
char -> int -> long -> float -> double
對於char來實現int,它需要一個步驟。但要實現雙倍,它將需要4個步驟。所以結果是:
int_char
但我改變paremeter的順序爲:
static void f(int i, char j){
System.out.println("int_char");
}
static void f(char i, double j){
System.out.println("char_double");
}
,編譯器將提出一個錯誤的曖昧。爲什麼?
另一種情況是如下:
static void f(char i, Character j){
System.out.println("char_Character");
}
static void f(Character i, Character j){
System.out.println("Character_Character");
}
兩個第二參數的使用atuoboxing。但是void f(char i,Character j)的第一個參數完全匹配。爲什麼這兩個功能一起會導致模糊?
最後,如果這些功能的人出現與follwing之一:
static void f(Character... i){
System.out.println("Character_varargs");
}
的輸出是不Character_varargs,因爲擴大>拳擊>可變參數。但是當兩個模棱兩可的函數是與Character_varargs類似的:
static void f(char i, Character j){
System.out.println("char_Character");
}
static void f(Character i, Character j){
System.out.println("Character_Character");
}
static void f(Character... i){
System.out.println("Character_varargs");
}
結果將是Character_varargs。爲什麼?
即使我們增加一些非模糊和高優先級的功能於重載功能,如:
static void f(int i, char j){
System.out.println("int_char");
}
static void f(char i, double j){
System.out.println("char_double");
}
static void f(int i, double j){
System.out.println("int_double");
}
static void f(Character... i){
System.out.println("Character_varargs");
}
結果還是Character_varargs。爲什麼?如果只考慮void f(int i,double j)和void f(Character ... i),則輸出應該是int_double。
當編譯器遇到不明確的函數時,是否直接「跳轉」到可變參數函數(如果有)而不考慮其他候選項?
謝謝!
這一切解釋在[JLS](http://docs.oracle.com/javase/specs/jls/se7/html/index.html)中有詳細介紹。你在那裏徹底研究過嗎? –
@JimGarrison對不起。我剛學了兩天就學了Java。我以前真的不知道這些材料。我試圖在那裏找到答案。感謝您的建議。 – Sheng