为什么varargs
必须是方法签名中的最后一个参数?
我想知道原因。
因为它使编译器的生活更简单。没有真正的理由为什么它之后不能有更多的参数,但它需要一个更复杂的编译器,所以规范就是这样编写的。
主要原因是因为否则它可能会模棱两可......
例如,编译器如何判断参数是可变参数还是具有多个可变参数的长参数列表中的单独命名参数?
想象一个方法签名,如:
printNames(String... girls, String... boys);
如果你这样做printNames("Lucy", "Jo", "Paul")
,乔是男孩还是女孩?
作为模棱两可的另一个例子,在参数列表中较早地使用可变参数可能会在存在重载方法时导致问题。例如:
printFruit(String... apples, String orange);
printFruit(String... apples, String grapefruit, String orange);
编译器如何判断倒数第二个参数是葡萄柚还是额外的苹果?
请注意,这并不是 Java 独有的,大多数支持可变参数的语言出于相同的原因只允许 then 位于参数列表的末尾。