несовместимые типы: переменная вывода T имеет несовместимые границы

У меня есть следующий фрагмент кода

public int solution(int X, int[] A) {

    List<Integer> list = Arrays.asList(A);

По какой-то причине он выдает следующую ошибку компиляции

Solution.java:11: ошибка: несовместимые типы: переменная вывода T имеет несовместимые границы List list = Arrays.asList(A); ^ ограничения равенства: нижние границы целого числа: int[], где T — переменная типа: T extends Object, объявленный в методе asList(T...)

Я предполагаю, что это функция Java 8, но я не уверен, как устранить ошибку.


person PDStat    schedule 17.12.2014    source источник
comment
Используйте Integer[] вместо int[].   -  person sp00m    schedule 17.12.2014


Ответы (3)


Arrays.asList ожидает переменное число Object. int — это не Object, а int[], поэтому Arrays.asList(A) создаст List<int[]> всего с одним элементом.

Вы можете использовать IntStream.of(A).boxed().collect(Collectors.toList());

person tobias_k    schedule 17.12.2014
comment
Обратите внимание, что подход IntStream имеет несколько иную семантику, чем использование asList; изменения базового массива не отражаются в результирующем списке. (так что происходит какая-то копия). asList(T...) не копирует. Я не знаю, как это обойти, к сожалению. - person rcreswick; 12.05.2016
comment
@rcreswick Интересно, не знал. Однако, если такое поведение ожидается, то, вероятно, нет никакого способа добиться этого с помощью int[], поскольку int[] не может быть резервным массивом результирующего List<Integer>. - person tobias_k; 12.05.2016
comment
Я пытался найти способ добиться этого, и я думаю, что единственный способ - создать новый тип списка, который управляет доступом для повторного использования резервного массива, что, вероятно, устранит общие улучшения производительности, на которые вы надеетесь, используя резервный массив. - person rcreswick; 14.05.2016

В Java 8 вы можете сделать

List<Integer> list = IntStream.of(a).boxed().collect(Collectors.toList());
person Peter Lawrey    schedule 17.12.2014

Нет ярлыка для преобразования из int[] в список, поскольку Arrays.asList не имеет дело с боксом и просто создаст список, который вам не нужен. Вы должны сделать служебный метод.

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>();
for (int index = 0; index < ints.length; index++)
{
    intList.add(ints[index]);
}
person Sagar Koshti    schedule 17.12.2014