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