...
ставятся между типом и именем переменной, и становится можно передать любое количество аргументов, не упаковывая их в массив. На уровне байткода применение массива и варарга не отличаются: vararg-параметр
Foo...
превращается в параметр-массив Foo[]
, на этапе вызова подставляется неявное инстанцирование и заполнение массива.Чтобы избежать неоднозначностей, на vararg наложено ограничение: им может быть только один последний аргумент.
Vararg, как массив, может быть пустым. Иногда это приводит к неочевидному поведению. Допустим, имеем две перегрузки метода с аргументами
int...
и float...
. Вызов такого метода без параметров попадает в вариант с int
, как с более специфичным типом. Наличие же перегрузки с несовместимыми типами, например int...
и boolean...
, приводит при вызове к ошибке компиляции «Ambiguous method call».Когда типом варарга используется generic-параметр, возникает warning «Possible heap pollution from parameterized vararg type». Вам нужно убедиться, что вы понимаете в чем этот риск, что ваш код не приводит к heap pollution, и уведомить об этом компилятор аннотацией
@SafeVarargs
.