Бывают ситуации, когда в метод нужно передать какое-то количество параметров одного типа, но мы не знаем, сколько их будет. В Java это возможно сделать:
В method1 принимается String... names — вот эти три точки как раз означают, что в метод можно передать неопределенное количество переменных типа String. В main мы вызвали метод и передали 2 имени. Но можно передать 1 или 150.
Также возможна ситуация, когда надо передать разные типы. Это возможно, но помните, что vararg (это как раз наши три точки) всегда должен быть последним.
void method1(int age, String... names, int t) — нельзя. Vararg не последний.
void method1(int age, int t, String... names) — можно.
Как это происходит в Kotlin?
Как видите, разница только в том, что три точки заменились на ключевое слово vararg.
Проблема, с которой я столкнулась, и которая как раз толкнула меня на написание статьи: Что делать, если я хочу в method1 передать какой-то list с именами. Например:
val names = mutableListOf("Anna", "Kristina")
Если мы попробуем прямолинейно написать method1(names), то нам выйдет ошибка про несовместимость типов. Метод просит имена как отдельные переменные, а мы пробуем отдать весь список. Но выход есть:
method1(*names.toTypedArray())
Что тут происходит? Мы разбиваем наш лист на набор элементов типа String, а потом делаем из них Array, потому что vararg просит Array<out String> или переменные типа String, но не в массиве, а как отдельные и полноценные личности.
Что это за звездочка впереди? Это некий оператор spread, который как раз разбивает наш лист на отдельные элементы типа String.
А зачем ещё toTypedArray? Он как раз собирает все элементы, которые создала звёздочка и собирает их в Array, который как раз можно отдать как vararg. Ура :)