Как Arrays.asList(int []) может возвращать List <int []>?

Выполняя простую программу, я заметил эту проблему.

int[] example = new int[10];
List<Integer> exampleList = Arrays.asList(example);// Compilation error here  

Ошибка компиляции возвращается как cannot convert from List<int[]> to List<Integer>. Но List<int> не разрешено в java, поэтому почему такая ошибка компиляции?

Я не спрашиваю об автобоксинге здесь. Мне просто интересно, как Arrays.asList может вернуться List<int[]>.

Реализация asList

public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}

Поэтому он обрабатывает int [] как T, поэтому это происходит.

Ответ 1

В Arrays.asList нет автоматического автобоксинга для базовых ints.

  • int[] - фактически объект, а не примитив.

  • Здесь Arrays.asList(example) возвращает List<int[]>. List<int> - действительно недействительный синтаксис.

  • Вы можете использовать:

    Список < Целое число > exampleList = Arrays.asList(ArrayUtils.toObject(массив));

    с помощью Apache Commons ArrayUtils.

Ответ 2

Arrays.asList(...) отлично работает, чтобы преобразовать массив объектов в список этих объектов.

Кроме того, Arrays.asList(...) определен в Java 5 с конструкцией varag или, в порядке слов, он может принимать undefined количество параметров, и в этом случае он рассмотрит все эти параметры как члены массива и затем верните экземпляр List, содержащий эти элементы.

List<Object> objList = Arrays.asList(obj1, obj2, obj3);

Это означает, что вы можете создать список с одним элементом:

List<Object> objList = Arrays.asList(obj1);

Так как List<int> не разрешено в Java, когда вы используете массив int[] в качестве параметра для Arrays.asList, он будет рассматривать его как единственный элемент списка вместо массива int. Это потому, что массивы являются объектами сами по себе на Java, а int (и любой другой примитив) не является.

Итак, при преобразовании массива примитивов Arrays.asList попытается вернуть список примитивных массивов:

List<int[]> intArrayList = Arrays.asList(new int[]{ 1, 2, 3 });

Ответ 3

Подпись <T> List<T> asList(T... os) включает общий тип T. Степень общих типов охватывает только ссылочные типы (включая типы массивов), но не примитивные типы. Поэтому в вызове Arrays.asList(ints) с int[] ints T может быть разрешено только int[].

На более высоком уровне целью Arrays.asList является представление списка вашего массива. Это означает, что массив остается нетронутым, а его элементы становятся доступными через объект, реализующий List. Однако List может содержать только объекты, а ваш массив содержит примитивные int s. Это делает массив непригодным для отображения через интерфейс List.

В любом случае, если вы ищете элегантный синтаксис для создания списка Integers, напишите Arrays.asList(1,2,3).

Ответ 4

Массивы являются объектами в java, а не примитивными типами. Обратите внимание, что он говорит List<int[]> (список int-массивов), а не List<int>.