代码之家  ›  专栏  ›  技术社区  ›  Henrik Paul

方法签名中的对象数组

  •  5
  • Henrik Paul  · 技术社区  · 16 年前

    考虑以下方法签名:

    public fooMethod (Foo[] foos) { /*...*/ }
    

    public fooMethod (Foo... foos) { /*...*/ }
    

    说明:前者以foo对象数组作为参数- fooMethod(new Foo[]{..}) -而后者接受任意数量的foo类型的参数,并将它们作为方法中foo:s的数组呈现。- fooMethod(fooObject1, fooObject2, etc... )

    如果两个Java都被定义,那么Java就会抛出一个合适的值,声称它们是重复的方法。我做了一些侦查工作,发现第一个声明确实需要一个显式的foo对象数组,这是调用该方法的唯一方法。第二种方法实际上接受任意数量的foo参数,也接受foo对象数组。

    因此,问题是,由于后一种方法似乎更灵活,有没有理由使用第一个示例,或者我遗漏了任何重要的东西?

    4 回复  |  直到 16 年前
        1
  •  12
  •   Shimi Bandiel    16 年前

    这些方法实际上是相同的。

    这个特性称为varargs,它是一个编译器特性。幕后是翻译成前一个版本的。

    如果您定义一个接受对象的方法,会有一个陷阱…您发送了一个object[]类型的参数!

        2
  •  3
  •   skaffman    16 年前

    我想在Shimi的解释中增加一点,即vararg s语法的另一个限制是vararg必须是最后一个声明的参数。所以你不能这样做:

    void myMethod(String... values, int num);
    

    这意味着任何给定的方法只能有一个vararg参数。在希望传递多个数组的情况下,只能对其中一个数组使用varargs。

    实际上,当您将参数视为任意数量的不同值(而不是数组)时,varargs处于最佳状态。Java5将它们映射到一个数组,因为这是最方便的事情。

    一个很好的例子是string.format()。这里,varargs与第一个参数中的格式占位符匹配。

        3
  •  1
  •   Garth Gilmour    16 年前

    后者在Java 5中引入,并且现有的库正在逐步被重新构建以支持它。您可能仍然会使用前者强调该方法需要2+个输入,另外还有一些限制…可以使用。

        4
  •  0
  •   TToni    16 年前

    当然,没有性能问题或类似的事情需要考虑,所以归根结底就是语义问题。

    您是否希望方法的调用者手头有一个foo数组?然后使用foo[]版本。使用varargs变量强调使用“一束”foo而不是数组的可能性。

    VARARGS的一个经典例子:字符串格式(C语言,DunNo在Java中调用它):

    string Format(string formatString, object... args)
    

    在这里,您期望参数的类型不同,因此拥有一个参数数组是非常不常用的,因此varargs变量。

    另一方面

    string Join(string[] substrings, char concatenationCharacter)
    

    使用数组是完全合理的。

    另外请注意,在参数列表的末尾,可以有多个数组参数和一个vararg参数。