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
Susan Sarandonoriginal
2024-11-03 13:05:03805parcourir

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>

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>

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>

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>

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!

Déclaration:
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