这些方法是如何模棱两可的? (一个采用数组,另一个采用可变参数)

How are these methods ambiguous? (one takes array, another takes varargs)

这些 append() 方法如何模棱两可?

public class Try_MultipleArguments {

    public static void main(String[] args) {

        int array1[] = new int[] {1, 2, 3};

        int array2[] = new int[] {4, 5, 6};

        append(array1, array2);

        append(array1, 4, 5, 6);

    }

    public static int[] append(int[] array1, int[] array2) {
        int[] ans = new int[array1.length + array2.length];
        for(int i=0; i<array1.length; ++i) {
            ans[i] = array1[i];
        }
        for(int i=0; i<array2.length; ++i) {
            ans[i+array1.length] = array2[i];
        }
        return ans;
    }

    public static int[] append(int[] array1, int ... array2) {
        return append(array1,array2);
    }
}

更新

Varargs 相当于一个数组,但这是来自方法内部。从方法外部看,它不应该等同于它。

更新 2

我现在明白了,我可以将数组传递给可变参数。我不知道。总是解决这个需要。嗯....这是从 java 可变参数的一开始就开始的吗?

原因是因为 int... 和 int[] 都接受整数数组。

让我们看看他们接受了什么:

整数...

  • 整数列表 (1, 2, 3, 4)
  • 整数数组 ([1, 2, 3, 4])

整数[]

  • 整数数组 ([1, 2, 3, 4])

所以 Java 不允许这样做的原因是因为两者都试图接受 整数数组 。所以这并不是说它们是完全相同的东西。

A​​ quick proof 表明这不会编译:

public static void main (String[] args) throws java.lang.Exception {
    test(1, 1, 1);
}

public static void test(int[] args) {

}

public static void test(int... args) {

}

它们具有相同的定义。

事实上,int ... array2等同于int[] array2

在var args 方法中,如何使用变量array2.. 与数组相同吗???其实是一样的,只是表示方式不同...

根据文档,

It is still true that multiple arguments must be passed in an array, but the varargs feature automates and hides the process. Furthermore, it is upward compatible with preexisting APIs.

来自docs

The three periods after the final parameter's type indicate that the final argument may be passed as an array or as a sequence of arguments.

所以这是不明确的,因为数组也映射到可变参数。

使用可变参数定义方法时,可以使用数组调用:

public static void method(int... array) {
    // do something with array
}

public static void caller1() {
    // This works obviously
    method(1, 2, 3);
}

public static void caller2() {
    // This works also
    method(new int[]{1, 2,, 3});
}

事实上在Java中这两个调用是类似的。

如果用数组定义另一个方法:

public static void method(int[] array)

Java不知道调用哪个方法,因为数组调用已经可用

对于你的情况,这意味着你只能有一个签名:

public static int[] append(int[] array1, int ... array2)

并删除另一个。