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)
следует избегать, так как он будет принимать любую последовательность параметров, даже примитивов, поскольку они автоматически загружаются.