Основная причина в том, что потенциально неоднозначно в противном случае ....
Например, как компилятор может определить, являются ли аргументы varargs или отдельными именованными аргументами в длинном списке аргументов с несколькими переменными varargs?
Представьте себе подпись метода, например:
printNames(String... girls, String... boys);
Если вы делаете printNames("Lucy", "Jo", "Paul")
, Джо - мальчик или девочка?
В качестве еще одного примера двусмысленности, наличие varargs ранее в списке аргументов может вызвать проблемы при наличии перегруженных методов. Например:
printFruit(String... apples, String orange);
printFruit(String... apples, String grapefruit, String orange);
Как компилятор может определить, является ли второй или последний аргумент грейпфрутом или дополнительным яблоком?
Обратите внимание, что это не уникально для Java, большинство языков, которые поддерживают varargs, только по той же причине позволяют находиться в конце списка аргументов.