222

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

public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点的作用是什么?

4

5 回答 5

221

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

于 2010-03-02T22:38:13.043 回答
71

在方法中使用省略号可变参数的方法就像它是一个数组:

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);

对于可变参数方法,序列参数被视为相同类型的数组。因此,如果两个签名的不同之处仅在于一个声明一个序列,另一个声明一个数组,如下例所示:

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

然后发生编译时错误。

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

于 2014-05-04T06:11:53.857 回答
25

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

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

于 2010-03-02T23:01:57.183 回答
7

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

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

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

varargs是在Java 1.5上添加的

于 2010-03-02T22:48:49.053 回答
4

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

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

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

于 2010-03-02T22:41:53.267 回答