Что такое эллипсис (...) для этой сигнатуры метода?

В App Engine docs, что такое эллипсис (JID...) для этой сигнатуры метода?

public MessageBuilder withRecipientJids(JID... recipientJids)

Какова функция этих трех точек?

Ответ 1

Это Java varargs. Они позволяют передавать любое количество объектов определенного типа (в этом случае они имеют тип JID).

В вашем примере будут выполняться следующие вызовы функций:

MessageBuilder msgBuilder; //There should probably be a call to a constructor here ;)
MessageBuilder msgBuilder2;
msgBuilder.withRecipientJids(jid1, jid2);
msgBuilder2.withRecipientJids(jid1, jid2, jid78_a, someOtherJid);

Подробнее здесь: http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html

Ответ 2

Способ использования многоточия или varargs внутри метода выглядит так, как если бы это был массив:

public void PrintWithEllipsis(String...setOfStrings) {
    for (String s : setOfStrings)
        System.out.println(s);
}

Этот метод можно назвать следующим:

obj.PrintWithEllipsis(); // prints nothing
obj.PrintWithEllipsis("first"); // prints "first"
obj.PrintWithEllipsis("first", "second"); // prints "first\nsecond"

Внутри PrintWithEllipsis тип setOfStrings - это массив String. Таким образом, вы можете сохранить компилятор некоторой работы и передать массив:

String[] argsVar = {"first", "second"};
obj.PrintWithEllipsis(argsVar);

Для методов varargs параметр последовательности рассматривается как массив того же типа. Поэтому, если две подписи отличаются только тем, что объявляет последовательность, а другой - как в этом примере:

void process(String[] s){}
void process(String...s){}

то возникает ошибка времени компиляции.

Источник: Спецификация языка Java, где технический термин variable arity parameter, а не общий термин varargs.

Ответ 3

Три точечные (...) обозначения фактически заимствованы из математики, а это означает "... и т.д.".

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

Ответ 4

Это varargs, они используются для создания метода, который получает любое количество аргументов.

Например, метод PrintStream.printf использует его, поскольку вы не знаете, сколько аргументов вы будете использовать.

Они могут использоваться только как конечная позиция аргументов.

varargs был добавлен на Java 1.5

Ответ 5

Это означает, что метод принимает переменное количество аргументов ( "varargs" ) типа JID. Внутри метода представлен recipientJids.

Это удобно для случаев, когда у вас есть метод, который может обрабатывать более одного аргумента естественным образом и позволяет вам писать вызовы, которые могут передавать один, два или три параметра одному и тому же методу, не имея уродство создания массива на лету.

Он также позволяет использовать идиомы, такие как sprintf из C; см. String.format(), например.

Ответ 6

Вы можете определить параметр, который может принимать переменные аргументы (varargs) в ваших методах. Ниже приведен пример класса Employee, который определяет метод daysOffWork, который принимает переменные аргументы:

class Employee { 
    public int daysOffWork(int... days) {
        int daysOff = 0;
        for (int i = 0; i < days.length; i++) {
            daysOff += days[i];
        }
        return daysOff;
    } 
}

Эллипсис (...), следующий за типом данных, указывает, что параметр метода дней может быть передан массив или несколько значений, разделенных запятыми.