Fout: Generic Array Creation

Ik begrijp de fout van Generic Array Creation niet.
Eerst probeerde ik het volgende:

 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;
}

Toen probeerde ik dit:

PCB[] res = new PCB[100];

Ik moet iets missen want dat lijkt goed. Ik heb geprobeerd het op te zoeken, echt waar. En er klikt niets.

Mijn vraag is: wat kan ik doen om dit op te lossen?

de fout is:

.\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

Tool voltooid met afsluitcode 1


Antwoord 1, autoriteit 100%

U kunt geen arrays maken met een generiek componenttype.

Maak in plaats daarvan een array van een expliciet type, zoals Object[]. Je kunt dit vervolgens casten naar PCB[]als je wilt, maar ik raad het in de meeste gevallen niet aan.

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

Als je typeveiligheid wilt, gebruik dan een verzameling zoals java.util.List<PCB>in plaats van een array.

Trouwens, als listal een java.util.Listis, moet je een van de toArray()-methoden gebruiken, in plaats van ze in uw code te dupliceren. Dit lost het type-veiligheidsprobleem echter niet op.


Antwoord 2, autoriteit 10%

Het volgende geeft u een array van het gewenste type met behoud van typeveiligheid.

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;  
}

Hoe dit werkt, wordt uitgebreid uitgelegd in mijn antwoordop de vraag die Kirk Woll als duplicaat heeft gelinkt.


Antwoord 3, autoriteit 6%

Naast de manier die wordt gesuggereerd in het “mogelijke duplicaat”, is de andere manier om dit probleem te omzeilen, dat de array zelf (of op zijn minst een sjabloon van één) wordt geleverd door de beller, die hopelijk het concrete weet. type en kan dus veilig de array maken.

Dit is de manier waarop methoden zoals ArrayList.toArray(T[])worden geïmplementeerd. Ik raad je aan om die methode eens te bekijken voor inspiratie. Beter nog, je zou die methode waarschijnlijk toch moeten gebruiken, zoals anderen al hebben opgemerkt.

Other episodes