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

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

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

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

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

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

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

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

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

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

 String[] args 

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

Это varargs

Проще говоря, его Array Member вроде

 public setMembers(Member[] members); 

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

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

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

Также см

  • вар-Arg-из-объектных массивов-против-объекта-массива, пытаясь для понимания-а-SCJP-самопроверку

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

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

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

Тем не менее, волшебный бит вызывает вызов метода. Прежде чем синтаксис varargs был введен, вы бы назвали метод немного следующим:

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

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

 setMembers(member1, member2, member3); 

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

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

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

Возможно, вам захочется ознакомиться с использованием переменных Variable Arguments (или varargs) в Java .

Он называется 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.

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

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

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

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

  • Что происходит с объявленной, неинициализированной переменной в C? Имеет ли это значение?
  • Interesting Posts
    Давайте будем гением компьютера.