此方法签名中的省略号(...)是什么?

时间:2010-03-02 22:35:56

标签: java ellipsis

App Engine docs中,此方法签名中的省略号(JID...)是什么?

public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点的功能是什么?

5 个答案:

答案 0 :(得分:197)

那些是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

答案 1 :(得分:59)

在方法中使用省略号 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){}

然后发生编译时错误。

来源:The Java Programming Language规范,其中技术术语为variable arity parameter,而不是公共术语varargs

答案 2 :(得分:21)

三点(......)表示法实际上是从数学中借用的,它的意思是“......等等。”

至于它在Java中的用法,它代表varargs,这意味着可以将任意数量的参数添加到方法调用中。唯一的限制是varargs必须位于方法签名的末尾,每个方法只能有一个。

答案 3 :(得分:5)

它们是varargs,用于创建接收任意数量参数的方法。

例如PrintStream.printf方法使用它,因为你不知道你将使用多少个参数。

它们只能用作参数的最终位置。

Java 1.5

上添加了

varargs

答案 4 :(得分:3)

这意味着该方法接受JID类型的variable number of arguments(“varargs”)。在该方法中,提出了recipientJids

这对于你有一个方法可以选择以自然的方式处理多个参数的情况很方便,并允许你编写可以将一个,两个或三个参数传递给同一个方法的调用,而不需要在飞行中创建阵列的丑陋。

它还可以使用来自C的sprintf等习语;例如,请参阅String.format()