Ответ 1
Из docs:
Три периода после окончательного типа параметра указывают, что последний аргумент может быть передан как массив или как последовательность аргументов.
Так что это неоднозначно, потому что массив также сопоставляется с 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?
Из docs:
Три периода после окончательного типа параметра указывают, что последний аргумент может быть передан как массив или как последовательность аргументов.
Так что это неоднозначно, потому что массив также сопоставляется с varargs.
Причина в том, что int... и int [] принимают массив из int.
Посмотрим, что они принимают:
Таким образом, причина, по которой 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) {
}
Они имеют одинаковое определение.
Фактически, int ... array2
эквивалентно int[] array2
.
В методе var args, как вы используете переменную array2
. То же, что и массив справа??? Это то же самое, просто обозначенное иначе...
Из документации
По-прежнему верно, что в массиве должны быть переданы несколько аргументов, но функция varargs автоматизирует и скрывает процесс. Более того, он совместим с предыдущими API-интерфейсами.
При определении метода с 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)
и удалите другой.