Mit Generics Klasse erstellen die selbst T erweitert..?

sirbender

Top Contributor
Hallo,

kann ich mittels Generics eine Klasse erstellen die Instanzen von T aufnimmt und selbst eine Instanz von T ist?

Vielleicht hilft ein bischen Code um zu zeigen was ich meine:

Java:
class SelfContainer<T> extends T {

     public SelfContainer(T parent, T child) {
     }

}

Rectangle parent = new Rectangle();
Rectangle child = new Rectangle();
Rectangle rect = new SelfContainer(parent, child);

Wie ihr seht kann ich einfach schreiben "Rectangle rect" weil SelfContainer in diesem Fall ein Rectangle ist.

Ich nehme an, das geht nicht?
 
Zuletzt bearbeitet von einem Moderator:
Es würde auf jedenfall so funktionieren:
Java:
public class Test {

  public static void main(String[] args) {
    Shape parent = new Rectangle();
    Shape child = new Rectangle();
    Shape rect = new SelfContainer(parent, child);
  }
}

interface Shape {
}

class Rectangle implements Shape {
}

class SelfContainer<T extends Shape> implements Shape {

  public SelfContainer(T parent, T child) {
  }

}

Um auf deine Frage einfach zu beantworten: Nein. Du kannst keine generische Oberklasse/Interface für eine Klasse definieren.

Das was du tun kannst, ist ein Interface zu haben, dass wiederum einen Typparameter besitzt.

Java:
interface Universal<T> {
}

class Rectangle implements Universal<Rectangle> {
}

class SelfContainer<T extends Universal<T>> implements Universal<T> {

  public SelfContainer(T parent, T child) {
  }

}

Generelle Frage: Für was brauchst du das?
 
Ich haette gerne eine generelle Container-Klasse die ich nutzen kann um alle moeglichen Objekte reinzustecken und der Container sollte dann vom Typ des Objekts sein, d.h. ich kann direkt Methoden des Typ auf den Container aufrufen, der mein Objekt kapselt.

A a = new A();
Container c = new Container<?!?!>(a);

c.callMethodFromA();
 
nein es funktioniert so nicht. Außer du leitest dein Container deiner Klasse A ab und hälst es als Wrapper.
 
nein es funktioniert so nicht. Außer du leitest dein Container deiner Klasse A ab und hälst es als Wrapper.

Kleine Ergänzung: Das geht deswegen nicht, weil die JVM dann zur Laufzeit das "extends" ausführen müsste; das ist aber der Job des Compilers.
In C/C++ ginge das, weil das Pandon zu generics dort "Template" heisst. Hier wird für jeden Typ, den du benutzt (z.B. SelfContainer<A>, SelfContainer<B>) eigener Code compiliert, der den genauen Gegebenheiten entspricht. In Java wird der selbe Bytecode für alle Generic-Typen einer Klasse/Methode verwendet.
 

Zurück
Oben