Maison > Java > javaDidacticiel > Pourquoi ne puis-je pas déclarer un tableau de listes génériques en Java ?

Pourquoi ne puis-je pas déclarer un tableau de listes génériques en Java ?

Susan Sarandon
Libérer: 2024-11-03 13:05:03
original
809 Les gens l'ont consulté

Why Can't I Declare an Array of Generic Lists in Java?

Effacement incomplet dans les tableaux génériques

Les tableaux génériques posent un défi unique en Java en raison du concept d'effacement de type. Cet article explore les différences entre deux fragments de code apparemment similaires et met en lumière les raisons sous-jacentes du comportement du compilateur.

Syntaxe et sémantique

Considérez le code suivant :

<code class="java">ArrayList<Key> a = new ArrayList<Key>();</code>
Copier après la connexion

Ce code se compile sans problème, car il crée une instance d'un ArrayList générique. Cependant, le code suivant entraîne une erreur de compilation :

<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
Copier après la connexion

Dévoilement de l'effacement de type

Pour comprendre l'écart, nous devons approfondir le concept d'effacement de type. Lors de la compilation, les informations de type générique sont effacées, ce qui signifie qu'au moment de l'exécution, seul le type brut (dans ce cas, ArrayList) est disponible.

Tableaux bruts et listes spécifiques à un type

Un tableau nécessite un type brut, tandis que le premier fragment de code crée une référence à une liste générique (ArrayList) sans aucune information de type supplémentaire. Par conséquent, le compilateur n'a aucun problème à résoudre le type.

Cependant, le deuxième fragment de code tente de créer un tableau de références à des listes génériques. Cela enfreint les règles de sécurité des types car les tableaux ne sont pas des types paramétriques et ne peuvent pas accepter de variables de type ou de types paramétrés.

Une solution de transtypage

Pour contourner cette limitation, nous pouvons transtyper le tableau comme suit :

<code class="java">ArrayList<Key>[] a = (ArrayList<Key>[]) new ArrayList[10];</code>
Copier après la connexion

En spécifiant explicitement les informations de type générique dans le cast, nous informons le compilateur du type prévu des éléments du tableau. Cela satisfait aux exigences de sécurité de type du compilateur.

Approche liste de listes (LL)

Alternativement, nous pouvons utiliser une liste de listes :

<code class="java">ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();</code>
Copier après la connexion

C'est légal car ArrayList n'est pas un tableau. Chaque élément de l'ArrayList externe est un ArrayList, qui est un type entièrement instancié.

Sécurité et justification des types

Les restrictions du compilateur sur les tableaux génériques sont en place pour renforcer la sécurité des types. Sans ces vérifications, il serait facile d'introduire de subtiles erreurs d'exécution en attribuant des listes de différents types à un tableau de listes génériques.

En comprenant la raison derrière le comportement du compilateur, nous pouvons prendre des décisions éclairées sur quand et comment d'utiliser des tableaux génériques et des listes de listes, garantissant à la fois l'exactitude et la maintenabilité du code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal