【发布时间】:2016-04-03 10:51:03
【问题描述】:
我不明白为什么在案例 1 中,它没有给出编译错误,相反,在案例 2 (varargs) 中,它给出了编译错误。谁能详细说明编译器在这两种情况下有何不同?我浏览了很多关于它的帖子,但还无法理解。
案例#1
public class Test {
public void display(int a) {
System.out.println("1");
}
public void display(Integer a) {
System.out.println("2");
}
public static void main(String[] args) {
new Test().display(0);
}
}
输出为: 1
案例#2
public class Test {
public void display(int... a) {
System.out.println("1");
}
public void display(Integer... a) {
System.out.println("2");
}
public static void main(String[] args) {
new Test().display(0);
}
}
编译错误:
The method display(int[]) is ambiguous for the type Test
【问题讨论】:
-
是的,您的问题伴随着 AutoBoxing,因为 Java 不确定是否将 '0' 解释为 int 或 Integer...
-
@JayC667,同样的问题不在案例1中吗?我的意思是为什么在情况 1 java 肯定会调用 public void display(int a)?如何?为什么只有在案例 2 中它不确定?
-
我最好的猜测是,由于 Java 的 AutoBoxing 功能,编译器也必须考虑 varargs/paramarrays 来进行 AutoBoxing 转换。因此编译器将提供两种转换,将参数放入数组中:1) 直接传递原始类型,传递新 int[] {0},从而匹配
display(int... a),2) 通过 AutoBoxing 获取 vararg 参数,将你的 0到 new Integer[] {0},匹配您的display(Integer... a)方法。 -
现在有了这两个提议,编译器找不到一个比另一个匹配更好的方法签名,因此将它的不确定性抛回给你,欢迎你添加一个虚拟参数或显式地将你的参数转换为数组
-
@AR.3,不要将其标记为重复。您指定的那个是不同的。在这里,我询问了两种情况之间的差异,这在您将其标记为重复的问题中没有。
标签: java overloading wrapper variadic-functions primitive