web-dev-qa-db-ja.com

このメソッドシグネチャの省略記号(...)とは何ですか?

App Engine docs では、このメソッドシグネチャの省略記号(JID...)は何ですか?

public MessageBuilder withRecipientJids(JID... recipientJids)

これらの3つのドットの機能は何ですか?

190
natchy

それらはJava可変引数です。特定のタイプのオブジェクトをいくつでも渡すことができます(この場合、タイプは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

メソッド内でEllipsisまたは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[] argsVar = {"first", "second"};
obj.PrintWithEllipsis(argsVar);

varargsメソッドの場合、シーケンスパラメーターは同じ型の配列として扱われます。したがって、この例のように、一方がシーケンスを宣言し、もう一方が配列を宣言するという点でのみ2つの署名が異なる場合:

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

コンパイル時エラーが発生します。

ソース: Javaプログラミング言語 仕様。技術用語は、一般的な用語varargsではなくvariable arity parameterです。

59
Lucio

3つのドット(...)表記は、実際には数学から借用されており、「...など」を意味します。

Javaでの使用に関しては、varargsの略で、メソッド呼び出しに任意の数の引数を追加できることを意味します。唯一の制限は、varargsがメソッドシグネチャの最後になければならず、メソッドごとに1つしか存在できないことです。

21
James Goodwin

これらは varargs であり、任意の数の引数を受け取るメソッドを作成するために使用されます。

たとえば、使用する引数の数がわからないため、 PrintStream.printf メソッドはそれを使用します。

引数の最終位置としてのみ使用できます。

varargsJava 1.5 に追加されました

5
OscarRyz

これは、メソッドがJID型の 引数の可変数 ( "varargs")を受け入れることを意味します。メソッド内では、recipientJidsが表示されます。

これは、オプションで複数の引数を自然な方法で処理できるメソッドを持っている場合に便利です。オンザフライの配列。

また、Cのsprintfなどのイディオムも有効にします。たとえば、String.format()を参照してください。

3
Rob