Я что-то упустил, или varargs нарушают Arrays.asList? - PullRequest
3 голосов
/ 13 ноября 2008
  private void activateRecords(long[] stuff) {
    ...
    api.activateRecords(Arrays.asList(specIdsToActivate));
  }

Разве этот вызов Arrays.asList не должен возвращать список Long с? Вместо этого он возвращает List<long[]>

public static <T> List<T> asList(T... a)

Сигнатура метода соответствует результатам, varargs выбрасывает весь массив в список. Это то же самое, что и new ArrayList(); list.add(myArray) И да, я знаю, что оно должно использоваться следующим образом: Arrays.asList(T t1, T t2, T t3)

Я предполагаю, что вместо формы varargs я не могу просто использовать свой старый метод asList (по крайней мере, я думаю, что так оно и раньше работало), который бы брал содержимое и помещал их по отдельности в список? Любой другой чистый способ сделать это?

Ответы [ 2 ]

7 голосов
/ 13 ноября 2008

Это потому, что long [] и Long [] - это разные типы.

В первом случае T это long [], во втором T это Long.

Как это исправить? Во-первых, не использовать long []?

5 голосов
/ 13 ноября 2008

Автобокс не может быть сделан на массивах. Вам разрешено делать:

private List<Long> array(final long[] lngs) {
    List<Long> list = new ArrayList<Long>();
    for (long l : lngs) {
        list.add(l);
    }
    return list;
}

или

private List<Long> array(final long[] lngs) {
    List<Long> list = new ArrayList<Long>();
    for (Long l : lngs) {
        list.add(l);
    }
    return list;
}

(обратите внимание, что итерируемые типы разные)

, например

Long l = 1l;

но не

Long[] ls = new long[]{1l}
...