65 votes

Erreur de création de tableau générique

J'essaye de faire quelque chose comme ça :-

public static ArrayList<myObject>[] a = new ArrayList<myObject>[2];

monObjet est une classe. J'obtiens cette erreur : - Création d'un tableau générique (la flèche pointe vers new.)

73voto

aioobe Points 158466

Vous ne pouvez pas avoir de tableaux de classes génériques. Java ne le prend tout simplement pas en charge.

Vous devriez envisager d'utiliser une collection plutôt qu'un tableau. Par exemple,

public static ArrayList<List<MyObject>> a = new ArrayList<List<MyObject>();

Une autre solution consiste à créer une classe auxiliaire comme ceci

class MyObjectArrayList extends ArrayList<MyObject> { }

et ensuite créer un tableau de MyObjectArrayList .


Voici un bon article sur la raison pour laquelle cela n'est pas autorisé dans la langue. L'article donne l'exemple suivant de ce qui pourrait se passer si cela était autorisé :

List<String>[] lsa = new List<String>[10]; // illegal
Object[] oa = lsa;  // OK because List<String> is a subtype of Object
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[0] = li; 
String s = lsa[0].get(0);

11voto

Strin Points 627

Il existe un moyen plus simple de créer des tableaux génériques que d'utiliser List.

D'abord, laissons

public static ArrayList<myObject>[] a = new ArrayList[2];

Puis initialiser

for(int i = 0; i < a.length; i++) {
     a[i] = new ArrayList<myObject>();
}

6voto

newacct Points 42530

Vous pouvez faire

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList<?>[2];

o

public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList[2];

(La première est probablement meilleure.) Les deux provoqueront des avertissements non vérifiés, que vous pouvez pratiquement ignorer ou supprimer en utilisant : @SuppressWarnings("unchecked")

-1voto

temelm Points 806

Si vous essayez de déclarer une liste de tableaux de votre classe générique, vous pouvez essayer :

public static ArrayList<MyObject> a = new ArrayList<MyObject>();

ceci vous donnera une liste de tableaux de monobjet (taille 10), ou si vous avez seulement besoin d'une liste de tableaux de taille 2, vous pouvez le faire :

public static ArrayList<MyObject> a = new ArrayList<MyObject>(2);

ou vous essayez peut-être de créer une liste de tableaux de listes de tableaux :

public static ArrayList<ArrayList<MyObject>> a = new ArrayList<ArrayList<MyObject>>();

bien que je ne sois pas sûr que la dernière chose que j'ai dite soit correcte...

-1voto

Rostislav Matl Points 2167

Il me semble que vous utilisez le mauvais type de parenthèse. La raison pour laquelle vous ne pouvez pas définir un tableau de génériques est la suivante effacement de type .

De plus, la déclaration de votre variable "a" est fragile, elle devrait ressembler à ça :

List<myObject>[] a;

N'utilisez pas une classe concrète lorsque vous pouvez utiliser une interface.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X