Подтвердить что ты не робот

Является ли аргумент переменной длины обработанным как массив в Java?

Как я понимаю, array состоит из фиксированного числа элементов, а variable length argument принимает столько же аргументов, сколько вы передаете (одного типа). Но они такие же? Могу ли я передать тот, где ожидается другой?

4b9b3361

Ответ 1

Да, если у вас есть метод с параметром varargs следующим образом:

public void foo(String... names)

и вы вызываете это следующим образом:

foo("x", "y", "z");

тогда компилятор просто преобразует его в:

foo(new String[] { "x", "y", "z"});

Тип параметра names String[] и может использоваться как любая другая переменная массива. Обратите внимание, что он все равно может быть null:

String[] nullNames = null;
foo(nullNames);

Дополнительную информацию см. в документации для varargs.

Это не означает, что varargs взаимозаменяемы с массивами - вам все равно нужно объявить метод для принятия varargs. Например, если ваш метод был объявлен как:

public void foo(String[] names)

тогда первый способ его вызова не будет компилироваться.

Ответ 2

Они одинаковы, массив используется внутри JVM при создании методов varargs. Таким образом, вы можете обрабатывать аргумент vararg так же, как вы обрабатываете массив, поэтому используйте, например, расширенный для цикла

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}

и назовите его так или даже передайте массив

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});

Смотрите эту приятную статью для дальнейшего объяснения.

Ответ 3

Простой тест предполагает, что они одинаковы:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}

Выходы:

string1
string2
string3
string4
string5
string6