Sam*_*Sam 5 java parameters variadic-functions method-signature
为什么varargs必须是方法签名中的最后一个参数?
我想知道原因.
Ign*_*ams 16
因为它使编译器的生活更简单.没有真正的理由为什么它之后不能有更多的参数,但它需要更复杂的编译器,所以规范是这样编写的.
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的语言只允许出于相同的原因位于参数列表的末尾.