Les tableaux génériques et le mystère de l'effacement de type
Lorsque vous travaillez avec des génériques, il peut être difficile de comprendre pourquoi certaines déclarations de tableau sont autorisées et d'autres le sont 't. Considérez ce qui suit :
ArrayList<Key> a = new ArrayList<Key>(); // Compiles fine
Ce code se compile sans problème. Cependant, lorsqu'il s'agit de tableaux de listes génériques :
ArrayList<Key>[] a = new ArrayList<Key>[10]; // Compiler error
le compilateur se plaint. Pourquoi est-ce le cas ?
Le rôle de l'effacement de type
Ce problème découle du concept d'effacement de type en Java. Lorsqu'un type générique est compilé, ses paramètres de type sont supprimés et remplacés par des types bruts. Cela signifie qu'au moment de l'exécution, tous les types génériques sont traités comme leurs types bruts correspondants.
Dans le premier exemple, ArrayList
Cependant, un tableau est une autre histoire. Chaque élément d'un tableau doit avoir le même type. Ainsi, ArrayList
Résoudre le problème
Pour résoudre le problème, on peut convertir le tableau en un type brut explicite :
ArrayList<Key>[] a = (ArrayList<Key> []) new ArrayList[10];
Cette distribution indique essentiellement au compilateur que nous voulons un tableau d'objets ArrayList bruts, qui est un valide tapez.
Utilisation de listes imbriquées
Une autre option consiste à utiliser une liste de listes :
ArrayList<ArrayList<Key>> b = new ArrayList<ArrayList<Key>>();
Dans ce cas, b est une liste d'objets ArrayList, où chaque ArrayList peut contenir des éléments de type Key. Cette approche est légale car ArrayList n'est pas un type de tableau.
Informations supplémentaires
Pour plus d'informations sur ce sujet, reportez-vous au chapitre 7.3 du didacticiel Java officiel. Il explique comment les types de tableaux ne peuvent pas avoir de variables de type comme composants, à moins qu'il ne s'agisse de types génériques.
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!