Java 中方法重载中的 Varargs
以下代码无法编译。
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 的引用是模棱两可的,两种方法 test(int...) 在 varargspkg 中。在varargspkg中的主要和方法测试(浮法...主场比赛
这似乎是显而易见的,因为方法调用中的参数值可以提升到以及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));
}
则对该方法的调用不会发出任何编译错误。在这种情况下要调用的方法是接受一个 varargs 参数(前面代码段中的第一个参数)的方法。test(1, 2);
Integer
为什么在这种情况下没有报告第一种情况下的错误?此处似乎都应用了自动装箱和自动类型升级。是否首先应用自动装箱以解决错误?
甲骨文文档说,
一般来说,你不应该重载varargs方法,否则程序员将很难弄清楚调用哪个重载。
此链接中的最后一句。然而,这是为了更好地理解varargs。
另外,添加下面的代码编译就好了。
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。