Generisches Class<...>[]

Luk10

Top Contributor
Grüße,

leider habe ich wieder ein Problem mit Generics:
Ich habe

Code:
public abstract class SuperClass
und
Code:
public class LowerClass extends SuperClass
.
Was ich will ist
Java:
public abstract class SuperClass {
  // ...
  public static final Class<? extends SuperClass>[] COMPONENTS = { LowerClass.class };
  // ...
}

Wieso funktioniert das so nicht? Wenn ich den generischen Typ weglasse lässt es zumindest der compiler durch, obs dann auch meiner Anforderung entspricht hab ich noch nicht getest.

Danke!
 
G

Gast2

Gast
Arrays und Generics verstehen sich nicht besonders gut. Verwende besser eine
Code:
List<Class<? extends SuperClass>>
.
 

Luk10

Top Contributor
Hmm, schade, in diesem Fall (einer der wenigen) würde ein Array auch genügen ... nun gut dann eben eine Liste.

Danke!
 

Luk10

Top Contributor
Ich muss hier doch nochmal nachfragen, da ich mit dem "Class[]" oder auch der Liste mein Problem nicht lösen konnte:

Ich wollte das globale Class[] um mit einem Index zu einer Klasse "gewiesen" zu werden und dort eine weitere Globale Variable abzufragen (jede SubKlasse hat sie). Leider sind alle Klassen in dem Array vom Type
Code:
<? extends SuperClass>
und ich kann somit nicht auf eine Spezifische Klasse zugreifen.
Es gibt n SubClass(es) die alle extends SuperClass.

Nochmal kurz was ich machen wollte: Index -- List<Class<? extends SuperClass>> -- SubClassX -- SubClass.GLOBAL_VARIABLE

Das alles fühlt sich auch extrem Anti-OO an ... geht so ein bisschen in die Richtung von "abstract static". Kann mir vielleicht jemand einen Vorschlag machen sowas zu lösen.
Danke!
 
Zuletzt bearbeitet:
S

SlaterB

Gast
nicht statisch ist immer schnell bei OO,
erstelle zu jeder Klasse eine weitere interne Klase bzw. anonym, ein einzelnes Objekt eines Interfaces,
welches die Methode getGlobalVariable() hat und jeweils das richtige zurückgibt,
diese Objekte in eine Liste/ in ein Array
 

Luk10

Top Contributor
Die Liste oder das Array müssten dann aber dennoch statisch sein um von jeder Klasse aus erreichbar zu sein. Wenn jede SubClasse dann ihr Objekt (des Interfaces) im
Code:
static { }
initiliaisiert und in die Liste legt, ist die Reihenfolge willkürlich (glaube ich) und ich kann nicht mehr mit Indicies arbeiten ...

Objekte driket von jeder SubClass zu erstellen funktioniert auch nicht, da diese völlig andere Aufgaben haben und die globale Variable nur eine GUI Information enthält.

Hmhm
 

kaetzacoatl

Bekanntes Mitglied
Lad die Klassen doch in der main
in der Reihenfolge, in der du sie
haben willst. (ist der einzig sichere
Weg, dass alle Klassen auch geladen
sind, wenn die Liste dann aufgerufen wird!)
 
S

Spacerat

Gast
Lass doch die Sub- oder von mir aus auch die Superklassen ein Interface implementieren, welches die Konstanten (für alle Klassen gleiche Werte) oder einen Getter (für alle Klassen verschiedene Werte) darauf definiert.
 
S

SlaterB

Gast
Die Liste oder das Array müssten dann aber dennoch statisch sein um von jeder Klasse aus erreichbar zu sein. Wenn jede SubClasse dann ihr Objekt (des Interfaces) im
Code:
static { }
initiliaisiert und in die Liste legt, ist die Reihenfolge willkürlich (glaube ich) und ich kann nicht mehr mit Indicies arbeiten ...
das gilt im Moment quasi genauso,
wenn jede Klasse selber, dann zufällig, wenn zentral kontrolliert, dann geordneter,

statt
> public static final Class<? extends SuperClass>[] COMPONENTS = { LowerClass.class };
dann z.B.
> public static final ClassConst[] COMPONENTS = { LowerClass.createYourClassConst(), .. };

wobei dann noch je eine Methode dazukommt, nicht ganz schön wie schon die lang definierten Objekte,
aber Erfolg hat seinen Preis

-----

zur Dezentralisierung:
wenn die Indexe bekannt sind, dann kann die Liste/ das Array auch nur anfangs genug Platz haben,
und jeder schreibt sich an die richtige Stelle,

wozu aber überhaupt ein Array wenn alles so fest bekannt?
statt COMPONENTS[0] aufzurufen, bei dem anscheinend jeder weiß, dass das LowerClass ist,
könnte auch gleich eine einzelne Variable oder gleich die jeweilige Klasse selber aufgerufen werden?

das Konzept muss noch präzisiert werden bzw. hier ja egal, du wirst schon wissen was zu tun ist
 

Luk10

Top Contributor
wozu aber überhaupt ein Array wenn alles so fest bekannt?
statt COMPONENTS[0] aufzurufen, bei dem anscheinend jeder weiß, dass das LowerClass ist,
könnte auch gleich eine einzelne Variable oder gleich die jeweilige Klasse selber aufgerufen werden?

Nein, da der Aufrufer nur weiß, dass die Klasse extends SuperClass ist. Mit dem Index soll der Aufrufer auf die richtige SubClass verwiesen werden und seinen Wert bekommen.

@Spacerat
Dazu müsste der Aufrufer Referenzen zu diesen Objekten haben, die er unter Umständen nicht hat.
 

Luk10

Top Contributor
So ich habe das jetzt mal folgendermaßen implementiert:


Java:
public interface GuiInformation {


	public int getComponentColor();


}

Java:
public abstract class SuperClass {


	public static final GuiInformation[] GUI_INFO = new GuiInformation[50];


}

Java:
public class SubClass1 extends SuperClass {


	public static final int INDEX = 0;
	public static final int COLOR = 0xff00ff00;

	static {
		SuperClass.GUI_INFO[INDEX] = new GuiInformation() {

			@Override
			public int getComponentColor() {
				return COLOR;
			}

		};
	}
	
}

Eine Frage dazu:
Ist sichergestellt, dass GUI_INFO vor den static-Blöcken in den Sub-Klassen intialisiert wird?
 
Zuletzt bearbeitet:

kaetzacoatl

Bekanntes Mitglied
Ja, da das/der(???:L) Array
ja initialisiert werden muss,
um in ihm Objekte abzulegen.
Allerdings würde ich das in
die Superclass packen.
Java:
public abstract class SuperClass /*extends ???*/ {
 
    public static final GuiInformation[] GUI_INFO;
    static{
          GUI_INFO = new GuiInformation[50];
          GUI_INFO[0] = ...
    }
 
}
 
S

Spacerat

Gast
public static Object[] array ist im übrigen niemals eine tolle Idee. Allzu leicht liessen sich von überall her die Werte ändern.
 
S

SlaterB

Gast
du kannst das ganze übrigens doch noch etwas wieder eindampfen, auf
Java:
static {
        initGUIInfo(INDEX,COLOR);
    }
verkürzen, mit einer statischen Methode in der Superklasse, die das GuiInformation-Objekt erzeugt und ins Array ablegt

oder nur in der Superklasse
Java:
static {
        initGUIInfo(Sub1.INDEX,Sub1.COLOR);
        initGUIInfo(Sub2.INDEX,Sub2.COLOR);
        initGUIInfo(Sub3.INDEX,Sub3.COLOR);
        usw.
    }
 

Ähnliche Java Themen

Neue Themen


Oben