【发布时间】:2010-09-15 11:58:50
【问题描述】:
考虑以下方法签名:
public fooMethod (Foo[] foos) { /*...*/ }
和
public fooMethod (Foo... foos) { /*...*/ }
解释:前者采用 Foo 对象数组作为参数 - fooMethod(new Foo[]{..}) - 而后者采用任意数量的 Foo 类型参数,并将它们呈现为 Foo:s 的数组方法 - fooMethod(fooObject1, fooObject2, etc...)。
如果两者都被定义,Java 会抛出一个 fit,声称它们是重复的方法。我做了一些侦探工作,发现第一个声明确实需要一个显式的 Foo 对象数组,这是调用该方法的唯一方法。第二种方式实际上既接受任意数量的 Foo 参数,也接受一个 Foo 对象数组。
所以,问题是,由于后一种方法似乎更灵活,是否有任何理由使用第一个示例,还是我错过了任何重要的东西?
【问题讨论】:
-
不了解 Java,这是在黑暗中的一次尝试,但我认为第一个效率更高一些,因为:a) 您可能只会传递一个指针,并且 b ) 你将传递一个指向内存连续部分的指针。
-
@monoxide:不,两种形式都生成等效的调用字节码,两种形式都需要构建一个数组才能传递。
-
第二种形式只是第一种形式的语法糖。所以, fooMethod(new Foo(1), new Foo(2)) 在这里等同于 fooMethod(new Foo[] {new Foo(1), new Foo(2)})