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

Ari*_*său 8 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..."
    }
}
Run Code Online (Sandbox Code Playgroud)

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

关于这种行为的任何解释?谢谢!

Mat*_*all 10

第一个wide_vararg电话是模糊的,因为编译器可以:

  • ints扩展为longs,并调用第wide_vararg一种方法,
  • ints自动装入Integers,然后拨打第二个wide_vararg.

但是,它不知道它该做什么,所以它拒绝编译模糊的方法调用.如果你想要第一次编译调用,则声明i为a Integer或a long,而不是an int.


小智 1

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

在第一次调用中,参数被转换为 int[]。由于 Java 中的所有数组都是 Object 类的直接子类型,因此基元加宽的概念不适用,在这种情况下,两个重载同样适用,因为 long[] 和 Integer[] 处于同一级别。因此存在歧义