在java中重载var args方法和包装器方法时出现歧义错误

时间:2014-04-29 12:02:03

标签: java overloading ambiguity

我尝试编译以下代码但出现错误

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 )应该被调用..这是我的理解......这是某人解释为什么它含糊不清?

2 个答案:

答案 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;
    }
}