关于java:此方法签名中的省略号(…)是什么?

What is the ellipsis (…) for in this method signature?

在应用程序引擎文档中,此方法签名中的省略号(JID...用于什么?

1
public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点有什么作用?


那些是Java VARARGS。它们允许您传递任意数量的特定类型的对象(在本例中,它们是jid类型)。

在您的示例中,以下函数调用是有效的:

1
2
3
4
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


在方法中使用省略号或varargs的方法就像它是一个数组:

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

可以按如下方式调用此方法:

1
2
3
4
obj.PrintWithEllipsis(); // prints nothing
obj.PrintWithEllipsis("first"); // prints"first"
obj.PrintWithEllipsis("first","second"); // prints"first
second"

PrintWithEllipsis中,setOfStrings的类型是一个字符串数组。因此,您可以保存编译器的一些工作并传递一个数组:

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

对于varargs方法,序列参数被视为相同类型的数组。因此,如果两个签名只有一个声明序列,另一个声明数组,如本例所示:

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

然后发生编译时错误。

源代码:Java编程语言规范,技术术语是EDCOX1×10,而不是通用术语EDCOX1(4)。


三点(…)符号实际上是从数学中借来的,它的意思是"…等等"。

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


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

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

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

在Java 1.5上添加EDCOX1〔4〕


这意味着该方法接受JID类型的变量数参数("varargs")。在此方法中,提出了recipientJids

对于这样的情况,这很方便:您有一个方法可以选择以自然方式处理多个参数,并且允许您编写可以将一个、两个或三个参数传递给同一个方法的调用,而不需要动态创建数组。

它还支持来自C的成语,如sprintf;例如,参见String.format()