为什么varargs总是方法签名中的最后一个参数?

Sam*_*Sam 5 java parameters variadic-functions method-signature

为什么varargs必须是方法签名中的最后一个参数?

我想知道原因.

Ign*_*ams 16

因为它使编译器的生活更简单.没有真正的理由为什么它之后不能有更多的参数,但它需要更复杂的编译器,所以规范是这样编写的.

  • 是的,它可以。它计算所有参数,将最后一个参数保留在“ code”中,并将所有其他参数保留在“ names”中。 (2认同)

mik*_*era 10

主要原因是因为它可能是模棱两可的 ......

例如,编译器如何判断参数是varargs还是在带有多个varargs的长参数列表中的单独命名参数?

想象一下方法签名如:

printNames(String... girls, String... boys);
Run Code Online (Sandbox Code Playgroud)

如果你这样做printNames("Lucy", "Jo", "Paul")是乔男孩还是女孩?

作为歧义的另一个例子,在参数列表中较早使用varargs可能会在存在重载方法时导致问题.例如:

printFruit(String... apples, String orange);
printFruit(String... apples, String grapefruit, String orange);
Run Code Online (Sandbox Code Playgroud)

编译器如何判断倒数第二个参数是葡萄柚还是另外一个苹果?

请注意,这不是Java独有的,大多数支持varargs的语言只允许出于相同的原因位于参数列表的末尾.

  • "多个varargs"完全*与"varargs永远持续"不同的问题. (6认同)