Class<? extends Entity> Array

pausch

Aktives Mitglied
Hallo Javagemeinde,

Ich muss für mein Programm ein Array von Klassen erstellen, wobei hier nur Klassen einer bestimmten Superklasse vorkommen dürfen. Eclipse meint allerdings "Cannot create a generic array of Class<? extends Entity>.

Wo ist das Problem denn und wie kann ich es lösen?

Danke für euer Interesse, ich weiß nicht ob es helfen würde zu erklären, in welchem Zusammenhang ich das Array brauche, deshalb verzichte ich hier dadrauf, weil das den Rahmen sprengen würde.

Mein Code sieht aktuell folgendermaßen aus:

Java:
//...
private static LinkedList<Class<? extends Entity>> entities = new LinkedList<Class<? extends Entity>>();
//...

public static Class<? extends Entity>[] getEntites(){
		Class<? extends Entity>[] entityArg = new Class<? extends Entity>[entities.size()];
		for(int i=0; i<entityArg.length; i++){
			entityArg[i] = (Class<? extends Entity>) entities.get(i);
		}
		return entityArg;
	}

Mein erster Versuch war folgender, allerdings lief das ganze wegen einer ClassCastException nicht:

Java:
//...
private static LinkedList<Class<? extends Entity>> entities = new LinkedList<Class<? extends Entity>>();
//...

public static Class<? extends Entity>[] getEntites(){
		return (Class<? extends Entity>[]) entities.toArray();
}
 
new Class<? extends Entity>[entities.size()];
Hier steckt das Problem. Du musst einen konstanten Datentyp für die Initialisierung verwenden, und <? extends Entity> ist eben kein konstanter Datentyp. Soviel zur Probelmbeschreibung, da ich das gleiche Problem auch aktuell habe in meiner eigenen Anwendung, kann ich dir aber auch noch nicht weiter helfen 😀
 
Cannot create a generic array of Class<? extends Entity>
Richtig, deswegen folgender Workaround: Object-Array erzeugen und zum generischen Typ casten:

Java:
Class<? extends Entity>[] entityArg = (Class<? extends Entitiy>[])new Object[entities.size()];

Der Compiler wird dir ne Warning ausspucken. Kannst du aber mit ner @SupressWarnings Annotation ignorieren. Dieses Workaround wird auch in der API an diversen Stellen gemacht, zB bei den Collections.
 
Hm, vonwegen perfekt, man sollte erst Testen bevor man in Euphorie ausbricht....

Code:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class;
	at de.schaefer.mediaManagement.control.DataHandler.getEntites(DataHandler.java:28)
	at de.schaefer.mediaManagement.ui.general.StartView.<init>(StartView.java:41)
	at de.schaefer.mediaManagement.control.viewcontroller.RootController.<init>(RootController.java:38)
	at de.schaefer.mediaManagement.control.Run.main(Run.java:105)
 
Ui... stimmt, sorry, zu schnell geantwortet. Ich hatte grad folgendes im Kopf:

Java:
public class C<E>{
   E[] array;
   {
      array = (E[])new Object[10];
   }
}

Das funktioniert nämlich auch. Dein Fall ist wohl komplizierter, da der generische Typ ja im Array-Typ steckt. Boah, was macht man denn da ^^ Lass mich mal n bisschen rumprobieren...

edit: Hauptsache gleich mal wieder das Danke entzogen was??? Du Hund! 😉
 
Okay, jetzt aber. War viel zu kompliziert gedacht. Der Array-Typ an sich ist ja nicht generisch, es ist einfach Class. Für die Instantiierung des eigentlichen Arrays spielt der generische Typ von Class keine Rolle.

Java:
Class<? extends Entity>[] entityArg = new Class[entitySize];
 
Nach erfolgreichem (!) testenkann ich jetzt auch guten Gewissens schreiben: Perfekt 🙂

PS. Das 'danke' gibts bei mir nur auf Beiträgen die das Problem gelöst haben 🙂

Schönen Abend noch und nochmal: Danke!
😀😀
 

Neue Themen


Zurück
Oben