Как 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>
.