Массивы существовали с самого начала Java, в то время как varargs - довольно недавнее дополнение. Таким образом, большая часть старого кода все еще успешно использует массивы.
Также обратите внимание, что вызов универсального метода vararg с явным параметром массива может молча вызвать поведение, отличное от ожидаемого:
public <T> void foo(T... params) { ... }
int[] arr = {1, 2, 3};
foo(arr); // passes an int[][] array containing a single int[] element
Таким образом - помимо необходимости больших усилий без какой-либо явной выгоды - не всегда желательно заменять устаревшие параметры массива на varargs.
Не говоря уже о случаях, когда вы не можете этого сделать, потому что в списке параметров метода есть другой параметр после массива:
public void foo(String[] strings, String anotherParam) { ... }
Изменение порядка параметров может технически решить эту проблему, однако это нарушает код клиента.
Обновление: Effective Java 2nd. Редакция, Элемент 42: Используйте varargs разумно объясняет это более подробно, приводя также конкретный пример: Arrays.asList()
был модифицирован в Java5, чтобы иметь параметры vararg, что непреднамеренно нарушило многие существующие коды может вызывать неожиданности при использовании этой (теперь устаревшей) идиомы для печати массива:
System.out.println(Arrays.asList(myArray));
Update2: Дважды проверил источник, и он говорит, что проблема возникает с массивами примитивных типов, таких как int[]
. Перед varargs, код так:
int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };
System.out.println(Arrays.asList(digits));
выдаст ошибку компиляции, потому что только массивы ссылочных типов могут быть преобразованы в List
. Начиная с varargs и дооснащения asList
, приведенный выше код компилируется без предупреждений, и непредвиденный результат выглядит примерно так: "[[I@3e25a5]"
.