Java автоматически конвертирует коллекции в массивы аргументов?

Я знаю, что синтаксис аргумента массива Java "..." может принимать в качестве параметра массив или просто многие параметры, переданные методу. Тем не менее, я заметил, что он тоже делает для Collections:

public static void main(String[] args) {
    Collection<Object> objects = new ArrayList<>();
    test(objects);
}

public static void test (Object...objects) {
    System.out.println("no compile errors");
}

Это компилируется и запускается без необходимости вызова метода toArray(). Что происходит за сценой? Существуют ли дополнительные методы этого "автоматического преобразования" для этого синтаксиса?

Кстати, я использую Java 1.7.

Ответ 1

Он не преобразует коллекцию в массив. Он передает коллекцию в качестве первого аргумента vararg. Таким образом, тестовый метод получает массив из одного элемента, и этот элемент является ArrayList.

Это легко найти, заменив

System.out.println("no compile errors");

по

System.out.println(Arrays.toString(objects);

Или с помощью отладчика.

Ответ 2

A Collection<Object> также является Object, поэтому, когда вы вызываете test с

Collection<Object> objects = new ArrayList<>();
test(objects);

он будет вызываться с помощью одного параметра, который является вашей коллекцией: метод получит массив, содержащий один элемент.

Ответ 3

Что здесь происходит, так это то, что метод получает массив длиной 1, содержащий один Collection.

В большинстве случаев подпись

method(Object... objs)

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