我尝试编译以下代码但出现错误
static void test(long... x)
{
System.out.println("long...");
}
static void test(Integer... x)
{
System.out.println("Integer...");
}
public static void main(String [] args) {
int no=5;
test(no,no);//getting error at this point in eclipse 'The method test(long[]) is ambiguous '
}
我不知道为什么它含糊不清。意味着如果我传递int
值,它应该自动显示并且test(Integer..x)
应该被调用..类似的行test(long..x )
应该被调用..这是我的理解......这是某人解释为什么它含糊不清?
答案 0 :(得分:2)
int
参数与您的任何定义都不匹配 - 一个定义为long
,另一个定义为Integer
,因此由编译器决定。转换为long
与装箱Integer
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2
答案 1 :(得分:2)
变量arity在确定最具体的方法方面是最后的。在JLS 15.12.2.4中定义了多个vararg方法时应用哪些vararg方法的规则 - 这是一个提取:
一个名为m的变量arity成员方法比另一个更具体 变量arity成员同名方法如果:
- [...]
- 一个成员方法有k个参数,另一个有n个参数,其中n≥k,并且:
第一种方法的参数类型是U1,...,Uk-1, 英国[]。另一种方法的参数类型是T1,..., Tn-1,Tn []。对于从1到n的所有j,Uj<:Tj在你的情况下,k = n,和 U1 [] = int []和T1 [] = long []因此可以在int处进行确定 &lt ;:长或相反。
换句话说,考虑的类型不是int []与long [] 但是int vs long。它发生在int&lt ;: long所以int ...方法 应该选择并且应该编译。
结论:
代码应该(并且确实)可以用Java 7编译,但是不能用Java 5或6编译。下面的代码用Java 7打印int:
public class Test1 {
public static void main(String[] args) {
new Test1().m(1, 2);
}
int m(int... i) {
System.out.println("int");
return 0;
}
long m(long... i) {
System.out.println("long");
return 0;
}
}