Initialiser ArrayList<Long>
Pourquoi je ne peux initialiser la liste de tableaux, comme ceci:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
Mais ai eu une Erreur lors de l'utilisation:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
- les numéros par défaut sont de type int alors, quand java tente d'auto-box 1 et 2, il va le transformer en wrapper de type Entier et Entier n'est pas la même ou de toute façon liées à la Longue
Arrays.asList(1L, 2L)
- 1,2 sont ints et n'aspire
InformationsquelleAutor Luke | 2017-10-04
Vous devez vous connecter pour publier un commentaire.
Explication
Java transforme automatiquement
int
àlong
si nécessaire.Cependant, Java ne fait pas de même si une transformation de
Integer
àLong
est nécessaire.La fonction
Arrays.asList(...)
renvoie uneList<E>
avecE
être du type utilisé en tant que paramètres. Comme vous utilisez1, 2, 3
le type estint
. Cependant, l'utilisation générale de les types de données commeList<int>
n'est pas possible en Java (au moins actuellement). Par conséquent, il se transforme automatiquementint
àInteger
et produit unList<Integer>
objet. Ce processus est appelé auto-boxing, Java peut faire cela pour tous les types de données que l'objet de la représentation.Maintenant, si vous utilisez le constructeur
new ArrayList<Integer>(List<E> list)
il s'attend à ceE
être quelque chose de typeInteger
. Ainsi, unList<Integer>
fonctionne comme entrée.Mais lorsque vous utilisez
new ArrayList<Long>(List<E> list)
évidemmentE
doit être de typeLong
. Cependant l'objetInteger
est pas de typeLong
par conséquent, il ne pas accepter le paramètre. Le premier type le plus commun deInteger
etLong
est la classe abstraiteNumber
(qui détient aussiDouble
,Float
et autres) (la documentation).Solution
Donc tout tourne autour de l'entrée
1, 2, 3
être interprété commeint
au lieu delong
. Vous pouvez résoudre ce problème en explicitement dire que Java interpréter les numéros delong
, vous le faites en ajoutantl
ouL
après le nombre:Maintenant, vous recevez un
List<Long>
, qui est ensuite ajouté à uneArrayList<Long>
.Noter que la même technique peut être utilisée de manière explicite pour interpréter les nombres décimaux comme
float
au lieu dedouble
:1.5F
ou1.5f
asList
renvoie une coutume de taille fixeArrayList
et pasjava.util.ArrayList
.C'est parce que
1
et2
sont ints etArrays.asList(1, 2)
crée unList<Integer>
.Et le constructeur de copie de
ArrayList
nécessite l'argument du même type générique.Vous avez plusieurs options, mais le plus simple est de changer le
int
s enlong
s par l'ajout d'unL
suffixe:Noter qu'avec Java 9 vous pouvez aussi écrire à:
Arrays.asList
en ce qu'elle renvoie une Liste immuable - si vous souhaitezx
être mutable, vous avez encore besoin du constructeur de copie.Arrays.asList
est mutable, mais de taille fixe. Les réponses à cette question pourrait également être d'intérêt pour les futurs lecteurs.Vous devez spécifier une
Long
numéro à l'aide littéralel
ouL
.Parce que
Arrays.asList(1,2)
sera implicitement un retourList<Integer>
.Vous pouvez résoudre ce problème en utilisant la marche suivante: