45 votes

Erreur : Création d'un tableau générique

Je ne comprends pas l'erreur de création de tableau générique.
J'ai d'abord essayé ce qui suit :

  public PCB[] getAll() {
       PCB[] res = new PCB[list.size()];
           for (int i = 0; i < res.length; i++) {
               res[i] = list.get(i);
            }
       list.clear();
       return res;
}

Puis j'ai essayé de faire ça :

PCB[] res = new PCB[100];

Je dois manquer quelque chose parce que ça me semble correct. J'ai essayé de chercher, j'ai vraiment essayé. Et rien ne clique.

Ma question est la suivante : que puis-je faire pour résoudre ce problème ?

l'erreur est :

.\Queue.java:26: generic array creation
PCB[] res = new PCB[200];
            ^
Note: U:\Senior Year\CS451- file      
uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Outil terminé avec le code de sortie 1

48voto

erickson Points 127945

Vous ne pouvez pas créer de tableaux avec un type de composant générique.

Créer un tableau d'un type explicite, comme Object[] à la place. Vous pouvez alors convertir cette valeur en PCB[] si vous voulez, mais je ne le recommande pas dans la plupart des cas.

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */

Si vous voulez une sécurité de type, utilisez une collection telle que java.util.List<PCB> au lieu d'un tableau.

Au fait, si list est déjà un java.util.List vous devez utiliser l'un de ses toArray() au lieu de les dupliquer dans votre code. Cela ne vous permet cependant pas de contourner le problème de la sécurité des types.

5voto

gdejohn Points 1106

Ce qui suit vous donnera un tableau du type que vous voulez tout en préservant la sécurité des types.

PCB[] getAll(Class<PCB[]> arrayType) {  
    PCB[] res = arrayType.cast(java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size()));  
    for (int i = 0; i < res.length; i++)  {  
        res[i] = list.get(i);  
    }  
    list.clear();  
    return res;  
}

Le fonctionnement de ce système est expliqué en détail dans ma réponse à la question que Kirk Woll a liée comme un doublon.

3voto

Mark Peters Points 42201

Outre la méthode suggérée dans le "double éventuel", l'autre moyen principal de contourner ce problème est de fournir le tableau lui-même (ou au moins un modèle de tableau) à l'appelant, qui, espérons-le, connaîtra le type concret et pourra ainsi créer le tableau en toute sécurité.

C'est ainsi que des méthodes comme ArrayList.toArray(T[]) sont mises en œuvre. Je vous suggère de jeter un coup d'œil à cette méthode pour vous en inspirer. Mieux encore, vous devriez probablement utiliser cette méthode de toute façon, comme d'autres l'ont fait remarquer.

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