使用var-args和装箱的Java问题

时间:2011-10-02 18:56:38

标签: java

我有一个与以下代码段相关的问题:

    class VarArgsTricky {
    static void wide_vararg(long... x) {
        System.out.println("long...");
    }

    static void wide_vararg(Integer... x) {
        System.out.println("Integer...");
    }

    public static void main(String[] args) {
        int i = 5;
        wide_vararg(i, i, i); // needs to widen and use var-args
        Long l = 9000000000l;
        wide_vararg(l, l); // prints sucessfully "long..."
    }
}

对wide_vararg的第一次调用无法编译(说该方法是不明确的),而第二次编译就好了。

有关此行为的任何解释? 谢谢!

2 个答案:

答案 0 :(得分:10)

第一个wide_vararg调用是不明确的,因为编译器可以

  • int扩展为long,并调用第一个wide_vararg方法,
  • int自动装箱到Integer,然后拨打第二个wide_vararg

然而,它不知道应该做什么,所以它拒绝编译模糊的方法调用。如果您希望第一次调用编译,请将i声明为Integerlong,而不是int

答案 1 :(得分:1)

当调用var-arg方法时,参数在编译时转换为该类型的数组。

在第一次调用中,参数将转换为int []。由于Java中的所有数组都是Object类的直接子类型,因此原始扩展的概念不适用于这种情况,因为long []和Integer []处于同一级别,所以重载都同样适用。因此含糊不清