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

2022-08-31 05:50:46

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

public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点有什么作用?


答案 1

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


答案 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"

在 里面,的类型是 String 的数组。因此,您可以为编译器节省一些工作并传递一个数组:PrintWithEllipsissetOfStrings

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

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

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

则发生编译时错误。

来源:Java编程语言规范,其中技术术语而不是通用术语。variable arity parametervarargs


推荐