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

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

Barbara Streisand
Libérer: 2024-11-03 17:24:30
original
239 Les gens l'ont consulté

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

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
Copier après la connexion

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
Copier après la connexion

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 est un type générique, mais au moment de l'exécution, il est traité comme ArrayList. Ainsi, a peut contenir des objets ArrayList avec des éléments de type Key.

Cependant, un tableau est une autre histoire. Chaque élément d'un tableau doit avoir le même type. Ainsi, ArrayList[] nécessiterait que ses éléments soient ArrayList, ce qui n'est pas un type brut. L'effacement de type ne peut pas supprimer le paramètre générique, ce qui rend cette déclaration illégale.

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];
Copier après la connexion

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>>();
Copier après la connexion

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!

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