Инициализировать ArrayList

Почему я могу инициализировать ArrayList, например:

ArrayList<integer> x = new ArrayList<integer>(Arrays.asList(1,2));
</integer></integer>

Но при использовании:

ArrayList<long> x = new ArrayList<long>(Arrays.asList(1,2));
</long></long>
4 ответа

объяснение

При необходимости Java автоматически преобразует int в long.

Однако Java не делает то же самое, если требуется преобразование из Integer в Long.

Функция Arrays.asList(...) возвращает List где E - тип, используемый в качестве параметров. Когда вы используете 1, 2, 3 тип int. Однако общее использование типов данных как List невозможно в Java (по крайней мере в настоящее время). Поэтому он автоматически преобразует int в Integer и создает объект List. Этот процесс называется автоматическим боксированием, Java может сделать это для всех типов данных для их соответствующего представления объектов.

Если теперь вы используете конструктор new ArrayList<integer>(List<e> list)</e> </integer> он ожидает, что E будет чем-то типа Integer. Таким образом, List работает как вход.

Но когда вы используете new ArrayList<long>(List<e> list)</e> </long> очевидно, что E должен иметь тип Long. Однако объект Integer не имеет типа Long поэтому он не принимает параметр. Первый общий тип Integer и Long - это абстрактный класс Number (который также содержит ******, Float и другие) (документация).

Решение

Таким образом, все это вращается вокруг ввода 1, 2, 3 который интерпретируется как int вместо long. Вы можете исправить это, явно указав Java, чтобы интерпретировать числа так long, вы делаете это, добавляя l или L после номера:

new ArrayList<long>(Arrays.asList(1L, 2L, 3L));
</long>

Теперь вы получаете List который затем добавляется в ArrayList.

Обратите внимание, что тот же метод может использоваться для явного толкования десятичных чисел как float вместо ******: 1.5F или 1.5f


Это потому, что 1 и 2 являются int и Arrays.asList Arrays.asList(1, 2) создает List.

И конструктор копирования ArrayList требует, чтобы аргумент ArrayList тот же общий тип.

У вас есть несколько вариантов, но самым простым является изменение int в long, добавив суффикс L:

List<long> x = new ArrayList<long>(Arrays.asList(1L, 2L));
</long></long>

Обратите внимание, что с Java 9 вы также можете написать:

List<long> x = List.of(1L, 2L);
</long>


Вы должны указать Long число, используя литерал l или L

ArrayList<long> x = new ArrayList<long>(Arrays.asList(1L, 2L));
</long></long>


Поскольку Arrays.asList(1,2) будет неявным образом возвращать List.

Вы можете исправить это, используя следующую идиому:

ArrayList<long> x = new ArrayList<long>(Arrays.asList(1l,2l));
</long></long>

licensed under cc by-sa 3.0 with attribution.