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));
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 ).
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
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 int
s en long
s 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);
Vous devez spécifier un nombre Long
en utilisant littéral l
ou L
.
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
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));