web-dev-qa-db-fra.com

Initialize ArrayList <Long>

Pourquoi je peux initialiser ArrayList, comme ceci:

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

Mais obtenu une erreur lors de l'utilisation:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
6
Luke

Explication

Java transforme automatiquement int en long si nécessaire.

Cependant, Java ne fait pas la même chose si une transformation de Integer vers Long est nécessaire.

La fonction Arrays.asList(...) renvoie un List<E> Avec E étant le type utilisé comme paramètres. Lorsque vous utilisez 1, 2, 3, Le type est int. Cependant, l'utilisation générique des types de données comme List<int> N'est pas possible dans Java (au moins actuellement). Par conséquent, il transforme automatiquement int en Integer et produit un objet List<Integer>. Ce processus est appelé auto-boxing , Java peut le faire pour tous les types de données à leur représentation d'objet correspondante.

Si vous utilisez maintenant le constructeur new ArrayList<Integer>(List<E> list) il s'attend à ce que E soit quelque chose de type Integer. Un List<Integer> Fonctionne donc comme entrée.

Mais lorsque vous utilisez new ArrayList<Long>(List<E> list) évidemment E doit être de type Long. Cependant l'objet Integer n'est pas de type Long donc il ne le fait pas pas acceptez le paramètre. Le premier type courant de Integer et Long est la classe abstraite Number (qui contient également Double, Float et autres) (- documentation ).


Solution

Donc tout tourne autour de l'entrée 1, 2, 3 Interprétée comme int au lieu de long. Vous pouvez résoudre ce problème en explicitement en disant Java à interpréter les nombres comme long, vous le faites en ajoutant l ou L après le numéro:

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

Vous recevez maintenant un List<Long> Qui est ensuite ajouté à un ArrayList<Long>.


Notez que la même technique peut être utilisée pour interpréter explicitement les nombres décimaux comme float au lieu de double: 1.5F Ou 1.5f

17
Zabuza

C'est parce que 1 Et 2 Sont des nombres entiers et Arrays.asList(1, 2) crée un List<Integer>.

Et le constructeur de copie de ArrayList requiert que l'argument soit du même type générique.

Vous avez plusieurs options mais la plus simple est de changer les ints en longs en ajoutant un suffixe L:

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

Notez qu'avec Java 9 vous pouvez également écrire:

List<Long> x = List.of(1L, 2L);
13
assylias

Vous devez spécifier un nombre Long en utilisant littéral l ou L.

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
7
Nikolas

Parce que Arrays.asList(1,2) renverra implicitement un List<Integer>.

Vous pouvez résoudre ce problème en utilisant l'idiome suivant:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));
4
Mena