Java 8 varargs на сигнатуре основной функции

Я конвертировал Groovy кодовую базу в Java и забыл изменить

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

в

public static void main(String args[]) {

и все это время компилировал и запускал проект, чтобы удивляться только сейчас, что это законный код Java 8.

Я понимаю, что Java 8 Varargs позволяет функции иметь произвольное количество аргументов, "сжимая их в массив" в зависимости от их положения при вызове метода.

Но способ функционирует с String... args а также String[] args называются синтаксически по-разному:

void function1 (String[] args) {}
function1({"one", "two", "three"});

void function2 (String... args) {}
function2("one", "two", "three");

Так как же String... args так же законно, как String args[] при получении параметров из терминала?


Редактировать:

azurefrog связал ответ с другим вопросом, который великолепен. Я хотел бы упомянуть другой ответ, в котором комментарии содержат ответ, который я искал:

Почему основной Java не использует список аргументов переменной длины?

Комментарий 1: Интересно. Судя по другим ответам / комментариям, я думаю, что этот новый синтаксис основного объявления был добавлен в Java 1.5. Таким образом, среда выполнения Java определяет, основываясь на объявлении основного метода, передавать ли строки непосредственно в основной или сначала создать массив?

Комментарий 2: Нет, он всегда строит массив. String... args == String[] аргументы, насколько вызываемый метод касается. Параметр является массивом в любом случае

Это вопрос, который у меня был. Извините, если спросили плохо.

2 ответа

Решение

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

JLS 12.1.4 определяет это:

Метод main должен быть объявлен как public, static и void. Он должен указывать формальный параметр (§8.4.1), объявленный тип которого является массивом String. Поэтому любое из следующих объявлений является приемлемым:

public static void main(String[] args)

public static void main(String... args)

Как вы уже сказали, во время компиляции все varargs... меняются местами с массивами[],

Таким образом, компилятор Java распознает ваши параметры vararg и поместит их в массив.

Смотрите ответ @Louis_Wasserman для цитаты JSL.

https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html --- Учебное пособие по Java

Другие вопросы по тегам