Ситуация, которую вы описываете, будет довольно редкой: большую часть времени ваши элементы varargs будут String
с, или числами, или Widget
с ... для них будет необычно быть Object
s (может быть что угодно) или массивы.
Но если аргумент varargs является группой Object
с или типом массива, тогда возникает ваш вопрос: вы можете передать ему один массив, и тогда как компилятор узнает, имели ли вы в виду передать массив (тот, который вы предоставили) или последовательность из 1 элемента, который он должен поместить в массив для вас?
Быстрый тест показывает ответ:
public class TestClass {
public static void main(String[] args) {
Object anObject = new Object();
Object[] anArray = new Object[] {anObject, anObject};
System.out.println("object1 = " + anObject);
System.out.println("array1 = " + anArray);
takesArgs();
takesArgs(anObject, anObject);
takesArgs(anArray); // is this the same as array1?
takesArgs(anArray, anArray);
}
public static void takesArgs(Object... stuff) {
System.out.println("The array was " + stuff);
}
}
Результат выполнения (ваши точные цифры будут разными:
object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1
Таким образом, ответ таков: в неоднозначных случаях он обрабатывает то, что вы передали, как массив, а не создает новый массив для его переноса. Это имеет смысл, поскольку вы всегда можете обернуть его в массив самостоятельно, если вам нужна другая интерпретация.