以下代码无法编译。
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.
}
}
发出编译时错误。
对 test 的引用不明确,varargspkg.Main 中的方法 test(int...) 和 varargspkg.Main 中的方法 test(float...) 都匹配
这似乎很明显,因为方法调用中的参数值test(1, 2);
可以提升int
为float
如果任何一个或两个参数都以F
or为后缀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 参数的方法(前面代码段中的第一个)。
为什么在这种情况下没有报告第一种情况的错误?似乎自动装箱和自动类型提升都在这里应用。是否首先应用自动装箱以便解决错误?
Oracle 文档说,
一般来说,您不应该重载可变参数方法,否则程序员将很难弄清楚调用了哪个重载。
这个链接的最后一句话。然而,这是为了更好地理解可变参数。
还要添加下面的代码编译就好了。
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");
}
}
编辑:
以下是指示编译错误的快照。我创建了一个新应用程序,因此包名称不同。
我正在使用JDK 6。