web-dev-qa-db-fra.com

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

Je ne comprends pas l'erreur de la création d'un 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;
}


J'ai ensuite essayé de faire ceci:

PCB[] res = new PCB[100];


Je dois manquer quelque chose car cela me semble juste. J'ai essayé de le chercher, vraiment. Et rien ne clique.


Ma question est: 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 code de sortie 1

33
Luron

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

Créez à la place un tableau d'un type explicite, comme Object[]. Vous pouvez ensuite convertir ceci en PCB[] Si vous le souhaitez, 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 comme Java.util.List<PCB> Au lieu d'un tableau.

Par ailleurs, si list est déjà un Java.util.List, Vous devez utiliser une de ses méthodes toArray(), au lieu de les dupliquer dans votre code. Cela ne résout cependant pas le problème de sécurité de type.

40
erickson

Ce qui suit vous donnera un tableau du type souhaité 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;  
}

Comment cela fonctionne est expliqué en détail dans ma réponse à la question que Kirk Woll a liée en double.

4
gdejohn

Outre la façon suggérée dans le "doublon possible", l'autre moyen principal de contourner ce problème est que le tableau lui-même (ou au moins un modèle de l'un) soit fourni par l'appelant, qui, espérons-le, connaîtra le type concret et pourra créez donc le tableau en toute sécurité.

C'est ainsi que les méthodes comme ArrayList.toArray(T[]) sont implémentées. Je vous suggère de jeter un œil à cette méthode pour vous inspirer. Mieux encore, vous devriez probablement utiliser cette méthode de toute façon, comme d'autres l'ont noté.

4
Mark Peters