Как передать ArrayList параметру метода varargs?

В основном у меня есть ArrayList мест:

ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();

ниже этого я вызываю следующий метод:

.getMap();

параметры метода getMap():

getMap(WorldLocation... locations)

Проблема, с которой я столкнулась, - это я не уверен, как передать в список WHOLE locations этот метод.

Я пробовал

.getMap(locations.toArray())

но getMap не принимает это, потому что он не принимает объекты [].

Теперь, если я использую

.getMap(locations.get(0));

он будет работать отлично... но мне нужно как-то пройти во всех местах... Я мог бы, конечно, продолжать добавлять locations.get(1), locations.get(2) и т.д., но размер массива меняется. Я просто не использую концепцию ArrayList

Что было бы самым простым способом? Я чувствую, что сейчас просто не думаю прямо.

Ответ 1

Исходная статья: Передача списка в качестве аргумента методу vararg


Используйте метод toArray(T[] arr).

.getMap(locations.toArray(new WorldLocation[locations.size()]))

(toArray(new WorldLocation[0]) также работает, но вы бы выделяли массив нулевой длины без причины.)


Вот полный пример:

public static void method(String... strs) {
    for (String s : strs)
        System.out.println(s);
}

...
    List<String> strs = new ArrayList<String>();
    strs.add("hello");
    strs.add("wordld");

    method(strs.toArray(new String[strs.size()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

Ответ 2

В Java 8:

List<WorldLocation> locations = new ArrayList<>();

.getMap(locations.stream().toArray(WorldLocation[]::new));

Ответ 3

Более короткая версия принятого ответа с использованием гуавы:

.getMap(Iterables.toArray(locations, WorldLocation.class));

можно укоротить, статически импортировав в массив:

import static com.google.common.collect.toArray;
// ...

    .getMap(toArray(locations, WorldLocation.class));

Ответ 4

Вы можете сделать: getMap(locations.toArray(new WorldLocation[locations.size()])); или getMap(locations.toArray(new WorldLocation[0])); или getMap(new WorldLocation[locations.size()]);

@SuppressWarnings ("unchecked") необходим для удаления предупреждения ide.