package Oct2016;
public class Ques1021 {
public static void main(String[] args) {
Ques1021 ques1021 = new Ques1021();
ques1021.method01("test", 0);
ques1021.method01("test", "tttt");
ques1021.method01("test");
ques1021.method01("test", null);
}
public void method01(String s, Integer... i) {}
public void method01(String s, String... str) {}
}
程式碼無法編譯通過,原因在於第 3 次呼叫 ques1021.method01("test") 產生模糊匹配。
| 呼叫 | 匹配結果 |
|---|---|
method01("test", 0) | Integer...:0 自動裝箱為 Integer,匹配可變參數 Integer...。String... 無法匹配 Integer。 |
method01("test", "tttt") | String...:"tttt" 直接匹配 String...。Integer... 無法匹配 String。 |
method01("test") | 模糊匹配:兩個方法的可變參數部分均可接受零個引數,編譯器無法判斷選哪個,報錯 reference to method01 is ambiguous。 |
method01("test", null) | 模糊匹配:null 可匹配 Integer... 也可匹配 String...,同樣編譯失敗。 |
method01("test", (Integer[]) null) 或 method01("test", (String[]) null)。List<Integer>、List<String>,語義更清晰。null 無型別,極易導致可變參數重載模糊。