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.
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
<code class="java">ArrayList<Key>[] a = new ArrayList<Key>[10];</code>
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.
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
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.
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.
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
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!