【问题标题】:What is the ellipsis (...) for in this method signature?此方法签名中的省略号 (...) 是什么?
【发布时间】:2011-01-22 23:15:38
【问题描述】:

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

public MessageBuilder withRecipientJids(JID... recipientJids)

这三个点的作用是什么?

【问题讨论】:

  • 顺便说一下,我尝试了水平椭圆字符,,Unicode U+2026。 Java 8 中的 NetBeans 8 报告“非法字符”。所以 Java varargs 需要三个 FULL STOP(句点)...

标签: java ellipsis


【解决方案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 数组传递(这使得可变参数向后兼容)。
  • 另请注意,传递 0 varargs(无)是合法的。
  • 最后但同样重要的是,可变参数必须是方法的最后一个参数。因此,同一方法中不能有两个可变参数。也许,你会觉得这个方法很有趣docs.oracle.com/javase/7/docs/api/java/util/…
【解决方案2】:

在方法内部使用ellipsisvarargs的方式就像是一个数组:

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){}

然后发生编译时错误。

来源:The Java Programming Language 规范,其中技术术语是variable arity parameter,而不是常用术语varargs

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      varargs 被添加到Java 1.5

      【讨论】:

        【解决方案5】:

        这意味着该方法接受JID 类型的variable number of arguments ("varargs")。在该方法中,会显示recipientJids

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

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

        【讨论】:

          猜你喜欢
          • 2014-01-19
          • 2015-08-08
          • 1970-01-01
          • 2023-01-03
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多