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

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

public static void main (String[] args)

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

public static void main(String... args) 

8 ответов

Решение

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");
    }

}

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

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

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

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

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

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

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

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

Разве главное объявление не должно быть чем-то вроде этого...?

public static void main(String... args) 

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

это было String [] args до появления var args, но в настоящее время оба работают.

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

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

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

РЕДАКТИРОВАТЬ: я думаю, это не имеет значения, так как вы можете определить основной метод как:

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

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

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