Je veux déclarer une ArrayList
de type int
.
Pourquoi ce qui suit me donne une erreur:
ArrayList<int> list1 = new ArrayList<int>();
Mais les travaux suivants:
ArrayList<Integer> list1 = new ArrayList<Integer>();
?
ArrayList
ne peut référencer que des types, pas des primitives. Integer
est une classe, pas une primitive.
Lorsque vous déclarez ArrayList<Integer> list1 = new ArrayList<Integer>()
, vous créez une ArrayList
qui stockera le type Integer
et non la primitive int
.
Si vous souhaitez connaître la différence entre les types primitif et référence, consultez http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html
Parce que int
est un type primitif . Seuls les types référence peuvent être utilisés comme paramètres génériques.
La réponse courte est que les génériques (comme ArrayList<Integer>
) n'acceptent pas les types primitifs (int
), mais uniquement les objets (Integer
).
En effet, les classes telles que ArrayList
sont implémentées en utilisant des objets. Comme chaque classe hérite d'Object, le compilateur peut simplement connecter d'autres classes. Mais les types primitifs (comme int
) n'héritent pas de Object, car ils ne sont pas des classes. Donc, Sun/Oracle a créé la classe Integer
pour aider à cela.
Donc, en bref: int
n'est pas un Object
.
Toutes les réponses ci-dessus répondent pourquoi mais la racine de cette question est la boxe automatique et le déballage fréquents des types de données primitifs. Ce problème est déjà résolu par IntBuffer ou ChadBuffer ou vous nommez le type primitif déjà présent dans le dossier nio. Si vous voulez utiliser ArrayList primitif la prochaine fois, n'utilisez pas List, utilisez plutôt IntBuffer.
int est un type de données primitif mais Integer est une classe, de sorte qu'un tableau arrayList ne peut prendre que des types de référence en tant que paramètre, pas de type primitif
int n'est pas un objet et donc si type de liste est int, les implémentations de la liste ne peuvent pas être effectuées.
int
est une primitive
. Ce n'est pas une Object
.
Reportez-vous à ce link pour plus de détails.