Что означает многоточие () в этой сигнатуре метода?

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

public MessageBuilder withRecipientJids(JID... recipientJids)

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


person natchy    schedule 02.03.2010    source источник
comment
Кстати, я пробовал символ HORIZONTAL ELLIPSIS, , Unicode U + 2026. NetBeans 8 в Java 8 сообщает о недопустимом символе. Таким образом, Java varargs требует тройной FULL STOP (точка) ....   -  person Basil Bourque    schedule 25.01.2015


Ответы (5)


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

person FrustratedWithFormsDesigner    schedule 02.03.2010
comment
Обратите внимание, что аргументы также могут быть переданы как массив JID (это делает varargs обратно совместимым). - person mjn; 13.03.2010
comment
Также обратите внимание, что передача 0 varargs (ничего) является допустимой. - person Hawkeye Parker; 28.06.2012
comment
И последнее, но не менее важное: vararg должен быть последним параметром метода. Таким образом, у вас не может быть двух параметров vararg в одном методе. Возможно, вам этот метод покажется интересным docs.oracle.com/javase/7/docs/api/java/util/ - person BlackBrain; 17.08.2015

Можно использовать многоточие или 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 .

person Lucio    schedule 04.05.2014

Обозначение с тремя точками (...) фактически заимствовано из математики и означает «... и так далее».

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

person James Goodwin    schedule 02.03.2010

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

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

Их можно использовать только в качестве финальной позиции аргументов.

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

person OscarRyz    schedule 02.03.2010

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

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

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

person Rob    schedule 02.03.2010