Разве var-args можно использовать только как аргумент метода? - PullRequest
2 голосов
/ 03 октября 2009

Это нормально компилируется: -

public class Demo {

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

    }
}

Но это не компилируется.

public class Demo {

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

        //here i initiallize strVarArgs by some logic, like we do for arrays
    }
}

Пожалуйста, поправьте меня, если я синтаксически неправ. : -)


Клет писал: Это действительно просто синтаксический сахар для массива

Вот пример, за которым следует заявление из очень популярной книги Java, написанной Кэти Сьерра и Берт Бейтс (Head First Java, 2-е издание, McGraw-Hill / Osborne) : -

Тема дженериков,

<T extends MyClass>, где MyClass является классом, а

<T extends MyInterface>, где MyInterface - это интерфейс.

Ниже приводится копия книги (стр. 548, глава 16): -

В общем, «расширяет значит», «расширяет или реализует» ??? Java-инженеры должны были дать вам способ наложить ограничение на параметризованный тип, чтобы вы могли ограничить его. Но вам также нужно ограничить тип, чтобы разрешить только классы, которые реализуют определенный интерфейс. Итак, вот ситуация, когда нам нужен один тип синтаксиса для работы как с наследованием, так и с реализацией. Другими словами, это работает как для расширений, так и для реализаций. И победное слово было ... расширяется. Всякий раз, когда у солнечного инженера есть шанс повторно использовать существующее ключевое слово, как они делали здесь с «extends», они обычно делают это. Но иногда у них нет выбора ... (утверждаю, перечислим).

MyQuestion: Является ли var-args просто синтаксическим сахаром массива, без других функций, кроме массива ???

Ответы [ 2 ]

3 голосов
/ 03 октября 2009

Да, varargs применяется только к аргументам функции.

Это действительно просто синтаксический сахар для массива, поэтому вместо:

String... strVarArgs ;

хочешь

String strVarArgs[];
1 голос
/ 03 октября 2009

Пример:

public class VargArgsExample {

public static void printArgs(long requiredLongArgument, String... notRequiredStringArray) {
    System.out.println(requiredLongArgument);
    if (notRequiredStringArray != null) {
        for(String arg: notRequiredStringArray) {
            System.out.println(arg);
        }
    }
}

public static void main(String[] args) {
    printArgs(1L);
    printArgs(1L, "aa");
    printArgs(1L, "aa", "bb");
}

}

Как вы можете видеть, этот синтаксис сахар позволяет нам вызывать методы без указания аргумента varargs . Если аргумент vararg не передан, то он равен нулю.

Нет необходимости в другом способе объявления переменных, поэтому он не используется для него. И именно поэтому вы получаете ошибку во время компиляции.

...