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

public MessageBuilder withRecipientJids(JID... recipientJids)


这三个点的作用是什么?

评论

顺便说一句,我尝试了水平省略号,…,Unicode U + 2026。 Java 8中的NetBeans 8报告“非法字符”。因此,Java varargs需要三重FULL STOP(句号),....

#1 楼

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

评论


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

– mjn
2010-3-13在19:39



另外请注意,传递0个varargs(什么都没有)是合法的。

–霍基·帕克(Hawkeye Parker)
2012年6月28日0:00

最后但并非最不重要的是,vararg必须是方法的最后一个参数。因此,同一方法中不能有两个vararg参数。也许您会发现有趣的docs.oracle.com/javase/7/docs/api/java/util/…这个方法

– BlackBrain
15年8月17日在19:14

#2 楼

在该方法内部使用省略号或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数组。
因此,您可以节省编译器一些工作并传递一个数组:

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

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


,则发生编译时错误。

来源:Java编程语言规范,其技术术语为variable arity parameter而不是通用术语varargs

#3 楼

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

在Java中的用法表示varargs,表示任何可以将多个参数添加到方法调用中。唯一的限制是varargs必须在方法签名的末尾,每个方法只能有一个。

#4 楼

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

例如PrintStream.printf方法使用它,因为您不知道将使用多少个参数。 br />
它们只能用作参数的最终位置。

varargs是在Java 1.5上添加的

#5 楼

这意味着该方法接受JID类型的可变数量的参数(“ varargs”)。在该方法中,将显示recipientJids

这对于以下情况非常方便:您拥有一种方法,该方法可以选择以自然方式处理多个参数,并允许您编写可以传递一个参数的调用。 ,两个或三个参数用于同一方法,而不必在运行时立即创建数组。

它还启用了C语言中的惯用法,例如sprintf;例如,请参见String.format()