Как эти методы неоднозначны? (один принимает массив, другой принимает 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);
    }
}

UPDATE

Varargs эквивалентен массиву, но это изнутри метода. С внешней стороны метода он не должен быть эквивалентен ему.

ОБНОВЛЕНИЕ 2

Теперь я вижу, что могу передать массив в vararg. Я этого не знал. Всегда это оборачивалось этой необходимостью. Хм... Это было с самого начала java varargs?

Ответ 1

Из docs:

Три периода после окончательного типа параметра указывают, что последний аргумент может быть передан как массив или как последовательность аргументов.

Так что это неоднозначно, потому что массив также сопоставляется с varargs.

Ответ 2

Причина в том, что int... и int [] принимают массив из int.

Посмотрим, что они принимают:

Int...

  • список целых чисел (1, 2, 3, 4)
  • массив целых чисел ([1, 2, 3, 4])

ИНТ []

  • массив целых чисел ([1, 2, 3, 4])

Таким образом, причина, по которой Java не позволит это, заключается в том, что оба пытаются принять массив целых чисел. Так что это не то, что они то же самое.

A быстрое доказательство показывает, что это не скомпилируется:

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) {

}

Ответ 3

Они имеют одинаковое определение.

Фактически, int ... array2 эквивалентно int[] array2.

Ответ 4

В методе var args, как вы используете переменную array2. То же, что и массив справа??? Это то же самое, просто обозначенное иначе...

Из документации

По-прежнему верно, что в массиве должны быть переданы несколько аргументов, но функция varargs автоматизирует и скрывает процесс. Более того, он совместим с предыдущими API-интерфейсами.

Ответ 5

При определении метода с varargs его также можно вызвать с помощью массива:

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)

и удалите другой.