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

У меня вопрос о синтаксисе объявления Java main:

public static void main (String[] args)

Поскольку вы можете передавать переменное число строк при вызове основной функции, не следует ли это использовать список аргументов переменной длины, а не массив? Почему вызов командной строки этого метода со списком строковых параметров даже работает? (Если нет обработки за кадром, которая строит массив со списком строк, а затем передает этот массив основному методу...?) Не должно ли главное объявление быть чем-то более похожим на это...? -

public static void main(String... args) 

Ответ 1

main(String... args) и main (String[] args) - это то же самое: то, что вы получаете, это массив String. Varargs - это просто синтаксический сахар для вызывающего.

Я предполагаю, что, поскольку вы никогда не вызываете main() из кода, он не был модифицирован при вводе varargs.

Изменить: Собственно, почистите последнее предложение. main(String... args) - вполне допустимый синтаксис, конечно. Эти два стиля полностью взаимозаменяемы. Это прекрасно работает:

public class Test {

    public static void main(String... args) {
        System.out.println("Hello World");
    }

}

Ответ 2

Вы можете объявить главное в любом случае, и это работает отлично. Проблем "обратной совместимости" или "переоснащения" нет. Тем не менее, читатели вашего кода могут отвлекать внимание, и это вряд ли улучшит вашу программу.

В разделе 8.4.1 в разделе "Язык Java" (третье издание) говорится: "Если последний формальный параметр является параметром переменной arty типа T, считается, что он определяет формальный параметр типа T []".

Спецификация запуска программы Java находится в JLS 12.2, которая ссылается на главу 5 спецификации VM. Раздел VM spec 5.2 говорит, что VM вызывает метод открытого класса "void main(String[])". Поскольку спецификация VM не имеет понятия переменной arity, основная функция, которая была объявлена ​​с использованием "...", удовлетворяет требованию.

Ответ 3

Основной метод был разработан для Java 1.0.

Синтаксис "..." был введен в Java 1.5

Он реализован через массив определенного вами типа (моя догадка, но... если коды Java 1.4 и 1.5 байт совместимы, поэтому они должны быть реализованы с массивами).

Ответ 4

Нет основного метода Java, на самом деле вы можете объявить массив как vararg в своем основном методе:

public static void main(String... args) { System.out.println("Hi!"); }

Ответ 5

Основной синтаксис java предшествует varargs, которые были введены только в java 1.5.

Ответ 6

Не должно ли главное объявление быть чем-то более похожим на это??

public static void main(String... args) 

Собственно, это можно сделать без проблем.

Это было String [] args до того, как были введены var args, но в наши дни оба работают.

Ответ 7

Ну, второй синтаксис - это всего лишь вариант 1-го и да, было бы неплохо, но он не был встроен в Java в этот момент

Ответ 8

Почему вас это волнует? Никто не называет главный метод вручную. Он является внутренним для Java.

EDIT: Я думаю, теперь это не имеет значения, поскольку вы можете определить основной метод как:

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

Моя точка остается в силе, так как никто не называет main явно.