Как работает синтаксис объявления аргумента массива Java "..."? - PullRequest
48 голосов
/ 18 ноября 2010

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

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

}

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

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

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

Ответы [ 10 ]

34 голосов
/ 18 ноября 2010

Я считаю, что это было реализовано в 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

30 голосов
/ 18 ноября 2010

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

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

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

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

String[] args
22 голосов
/ 06 января 2011

Это varargs

Проще говоря, это Array из Member как

public setMembers(Member[] members);

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

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

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

См. Также

8 голосов
/ 18 ноября 2010

Это называется переменным аргументом, проверьте здесь:

Официальная документация (Java 1.5) находится здесь:

6 голосов
/ 06 января 2011

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

Однако магический бит заключается в вызове метода. До введения синтаксиса varargs метод вызывался бы примерно так:

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

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

setMembers(member1, member2, member3);

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

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

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

4 голосов
/ 06 января 2011
3 голосов
/ 06 января 2011

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

3 голосов
/ 18 ноября 2010

Это называется varadic аргумент: функция, которая принимает столько (включая ноль) аргументов, сколько вы хотите.Например, 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

2 голосов
/ 31 марта 2011

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

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

0 голосов
/ 31 марта 2011

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

...