Для чего нужен многоточие (…) в сигнатуре этого метода?

203

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

public MessageBuilder withRecipientJids(JID... recipientJids)

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

natchy
источник
7
Кстати, я попробовал персонаж ГОРИЗОНТАЛЬНОГО ЭЛЛИПСА , Юникод U + 2026. NetBeans 8 в Java 8 сообщает о «недопустимых символах». Таким образом , Java требует переменной длиной тройной полной остановки (период), ....
Василий Бурк

Ответы:

208

Это 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

FrustratedWithFormsDesigner
источник
16
Обратите внимание, что аргументы также могут быть переданы в виде массива JID (это делает varargs обратно совместимым).
MJN
54
Также обратите внимание, что прохождение 0 varargs (ничего) является законным.
Соколиный Глаз Паркер
9
И последнее, но не менее важное: vararg должен быть последним параметром метода. Таким образом, вы не можете иметь два параметра vararg в одном методе. Может быть, вы найдете этот метод интересным docs.oracle.com/javase/7/docs/api/java/util/…
BlackBrain
62

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

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.

Lucio
источник
22

Трехточечная (...) запись фактически заимствована из математики и означает «... и так далее».

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

Джеймс Гудвин
источник
5

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

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

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

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

OscarRyz
источник
3

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

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

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

обкрадывать
источник