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[] при захвате параметров из терминала?


Edit:

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

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

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

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

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

Ответ 1

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

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

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

public static void main(String[] args)

public static void main(String... args)

Ответ 2

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

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

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

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