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

Как работает синтаксис объявления аргументов массива Java "..."?

Я писал java некоторое время, и сегодня я столкнулся с следующим объявлением:

public static void main(String... args) {

}

Обратите внимание на "dot dot dot" в объявлении массива, а не на обычную скобку []. Ясно, что это работает. На самом деле я написал небольшой тест и проверил его работу. Итак, я вытащил грамматику Java, чтобы увидеть, где этот синтаксис объявления аргумента, но ничего не нашел.

Итак, для экспертов, как это работает? Является ли это частью грамматики? Кроме того, хотя я могу объявить такую ​​функцию, я не могу объявить массив внутри тела функции, как это.

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

4b9b3361

Ответ 1

Ознакомьтесь с Спецификация языка Java, третье издание, глава 8 (классы). Похоронен в этом самородок:

Если последний формальный параметр является переменным параметром arity типа T, считается, что он определяет формальный параметр типа T []. Затем метод является методом переменной arity. В противном случае это фиксированный метод arity. Вызовы метода переменной arity могут содержать более фактические выражения аргументов, чем формальные параметры. Все фактические выражения аргументов, которые не соответствуют формальным параметрам, предшествующим параметру переменной arity, будут оцениваться и результаты будут сохранены в массив, который будет передан вызову метода (§15.12.4.2).

В принципе, последний параметр любого вызова метода может иметь T.... Если он имеет это, он преобразуется в T[].

Итак, в основном, у вас есть причудливый способ воспроизведения более традиционных

String[] args

Ответ 2

Я считаю, что это было реализовано в Java 1.5. Синтаксис позволяет вызывать метод с разделенным запятыми списком аргументов вместо массива.

public static void main(String... args);
main("this", "is", "multiple", "strings");

совпадает с:

public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});

http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

Ответ 3

Это varargs

В простом смысле его an Array of Member как

public setMembers(Member[] members);

Когда использовать:

Вообще при проектировании API полезно использовать, когда количество аргументов не фиксировано.

Пример из стандартного API этого String.format(String format,Object... args)

Также см.

Ответ 5

Это так называемый синтаксис varargs. В теле метода вы можете прочитать параметр members как бы массив - на самом деле, он/есть/'просто' массив.

Однако волшебный бит вызывает вызов метода. До того, как был введен синтаксис varargs, вы бы назвали метод немного следующим:

setMembers(new Members[] {member1, member2, member3});

Вместе с новым синтаксисом varargs вам больше не нужно явно создавать массив, и вы можете передать:

setMembers(member1, member2, member3);

Это означает, однако, что аргумент varargs должен быть последним аргументом в методе. Поэтому подобное недопустимо:

void setMembers(Member ... members, String memberType);

Подводя итог: На самом деле это немного синтаксический сахар. Я не эксперт по внутренней работе компилятора Java, но я уверен, что методы, вызывающие метод, принимающий параметр varargs, перестраиваются в методы, которые строят массив данного типа.

Ответ 7

Это означает, что вы можете передать ноль или более объектов Member методу setMembers(). В методе setMembers members будет иметь семантику массива.

Ответ 8

Он называется varadic argument: функция, которая принимает столько (включая нулевые) аргументы, сколько вы хотите. Например, main("string1", "string2", "string3") совпадает с main({"string1", "string2", "string3"}), если main объявлен как void main(String...args).

См. http://www.java-tips.org/blog/java-se/varargs-%E2%80%93-java-50-addition.html

Ответ 9

Переменные аргументы. Может иметь 0 или более аргументов String.

Функция может получить доступ к параметрам в виде массива строк.

Ответ 10

Это означает, что метод принимает переменное число аргументов String. Аргументы рассматриваются как массив и поэтому доступны по индексу в том порядке, в котором они переданы.