Почему основной Java не использует список аргументов переменной длины? - PullRequest
23 голосов
/ 04 февраля 2010

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

public static void main (String[] args)

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

public static void main(String... args) 

Ответы [ 8 ]

40 голосов
/ 04 февраля 2010

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

}
15 голосов
/ 04 февраля 2010

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

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

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

9 голосов
/ 04 февраля 2010

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

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

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

6 голосов
/ 04 февраля 2010

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

public static void main(String... args) { System.out.println("Hi!"); }
1 голос
/ 04 февраля 2010

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

public static void main(String... args) 

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

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

1 голос
/ 04 февраля 2010

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

0 голосов
/ 04 февраля 2010

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

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

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

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

0 голосов
/ 04 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...