Этот метод:
public void foo(String... args) {}
фактически такой же, как:
public void foo(String[] args) {}
На самом деле - проверьте байт-код, это та же подпись. Или попробуйте объединить оба этих метода в один класс - компилятор вам не позволит, так как у них одинаковая сигнатура. Единственное различие между String...
и String[]
состоит в том, что любые вызывающие от до String...
получают синтаксический сахар: взять все аргументы, переданные в этой позиции, и создать для них массив.
Как следствие, вызов метода varargs и передача массива работает нормально:
public void foo(String... args) {
}
String[] a = new String[10];
foo(a); // compiles and runs fine.
Проблема в том, что массивы в java довольно громоздки, но varargs основан на них. Вы на правильном пути, чтобы избежать их, но при попытке динамически вызвать методы с переменными параметрами вы вынуждены их использовать. Что еще хуже, дженерики и массивы тоже плохо сочетаются. Тем не менее:
getPermutations(inputArrayList.toArray(ArrayList[]::new));
должно вас куда-то привести (это преобразует массив массивов в массив).