以下代碼不能編譯。在Java中重載方法的可變參數
package varargspkg;
public class Main {
public static void test(int... i) {
for (int t = 0; t < i.length; t++) {
System.out.println(i[t]);
}
System.out.println("int");
}
public static void test(float... f) {
for (int t = 0; t < f.length; t++) {
System.out.println(f[t]);
}
System.out.println("float");
}
public static void main(String[] args) {
test(1, 2); //Compilation error here quoted as follows.
}
}
發出編譯時錯誤。
參考測試是不明確的,在varargspkg.Main匹配在 varargspkg.Main兩個方法測試(INT ...)和方法試驗(浮動...)
這似乎是明顯,因爲在該方法中的參數值調用test(1, 2);
可以提升爲int
以及float
如果參數中的任何一個或兩者都被F
或f
後綴,它編譯。
如果我們然而,代表與相應的包裝類型的方法簽名的接收參數如下
public static void test(Integer... i) {
System.out.println("Integer" + Arrays.asList(i));
}
public static void test(Float... f) {
System.out.println("Float" + Arrays.asList(f));
}
然後調用test(1, 2);
不發出任何編譯錯誤的方法。在這種情況下調用的方法是接受一個Integer
varargs參數(在前面的代碼片段中的第一個參數)。
爲什麼在這種情況下,第一種情況的錯誤沒有報告?看起來這裏應用了自動裝箱和自動類型提升。首先應用自動裝箱,以便解決錯誤?
甲骨文的文檔說,
一般來說,你不應該重載可變參數的方法,或者 將是困難的程序員找出哪些超載得到 調用。
link的最後一句話。但是爲了更好地理解可變參數。
還要添加下面的代碼編譯就好了。
public class OverLoading {
public static void main(String[] args) {
load(1);
}
public static void load(int i) {
System.out.println("int");
}
public static void load(float i) {
System.out.println("float");
}
}
編輯:
以下是指示編譯錯誤snap shot。我創建了一個新的應用程序,因此包名稱不同。
我使用的是JDK 6
你原來的代碼適合我。輸出爲 int – techfoobar
@techfoobar - 第一個代碼片段中的代碼無法編譯(使用jdk 6,NetBeans 6.9.1)。它會按照指定生成編譯錯誤。它真的爲你編譯? – Tiny
好問題。想補充說,當我們覆蓋單個參數(int)和(float)時,它會得到解決。我在這裏聞到一個錯誤。 –