Как динамически передавать аргументы как varargs в Java - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь написать программу, которая будет принимать неизвестное количество массивов в качестве входных данных от пользователя, а затем печатать из них, функция, которую я написал, что print принимает varargs. Я пытаюсь сделать это в моем основном вызове метода print(arr1, arr2, arr3...) и динамически изменить его, поэтому мне не нужно устанавливать ограничение на то, сколько массивов может быть передано.

Мой первоначальный мыслительный процесс состоял в том, чтобы сохранить все массивы в 2d ArrayList, а затем распаковать их, так же, как в JavaScript есть оператор распространения, где вы можете иметь 2d-массив, а затем выполнять print(...inputArrays), но не похоже, что Java позволяет это.

1 Ответ

2 голосов
/ 17 июня 2020

Этот метод:

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));

должно вас куда-то привести (это преобразует массив массивов в массив).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...