【问题标题】:Ambiguity error while overloading var args method and wrapper methods in java在java中重载var args方法和包装器方法时出现歧义错误
【发布时间】:2014-04-29 20:33:26
【问题描述】:

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

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 ) 应该被调用..这是我的理解..有人可以解释一下为什么它是模棱两可的?

【问题讨论】:

标签: java overloading ambiguity


【解决方案1】:

int 参数与您的任何一个定义都不匹配 - 一个使用 long 定义,另一个使用 Integer 定义,因此由编译器决定。投射到long 与拳击到Integer 一样有效

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

【讨论】:

  • 你能把它和JLS链接起来吗?
【解决方案2】:

在确定最具体的方法时,变量的数量排在最后。在JLS 15.12.2.4 中定义了在有多个方法时确定应用哪种可变参数方法的规则 - 这是一个摘录:

一个名为 m 的变量成员方法比另一个更具体 同名的变量arity成员方法,如果:

  • [...]
  • 一个成员方法有k个参数,另一个有n个参数,其中n≥k,并且:

第一种方法的参数类型为U1,...,Uk-1, 英国[]。其他方法的参数类型是T1,..., Tn-1,Tn[]。对于从 1 到 n 的所有 j,Uj <: tj n u1 int t1 long>

换句话说,考虑的类型不是 int[] 与 long[] 但是int vs long。碰巧 int <: 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;
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多