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