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


203

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

public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点的作用是什么?


7
顺便说一句,我尝试了水平椭圆字符Unicode U + 2026。Java 8中的NetBeans 8报告“非法字符”。因此,Java varargs需要三重FULL STOP(句号)...
罗勒·布尔克

Answers:


208

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


16
注意,参数也可以作为JID数组传递(这使varargs向后兼容)。
mjn

54
另请注意,传递0个varargs(无效)是合法的。
Hawkeye Parker 2012年

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


22

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

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



3

这意味着该方法接受类型为的可变数量的参数(“ varargs”)JID。在方法内,recipientJids介绍了。

这对于以下情况非常方便:您拥有一种方法,该方法可以选择以一种自然的方式处理多个参数,并允许您编写可以将一个,两个或三个参数传递给同一方法的调用,而无需创建一个丑陋的对象动态数组。

它还启用了诸如sprintfC的习惯用语。String.format()例如,参见。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.