Generic Standartkonstruktor
-
Hi allerseits:
Folgender Code befindet sich in der Klasse
public class GenericStack < T >
:
public T pop() { if(naechster == null && belegt==false)//Trivialfall 2 Stack ist gänzlich leer { T x= (T) new Object(); return x; } else if(naechster == null ) //Trivialfall 2 Stack ist nur 1 Elemnt groß { T x =this.Inhalt; Inhalt= (T) new Object(); belegt=false; return x; } else if(naechster.naechster == null)//Trivialfall 3, das nächste Element ist das größte { T x= (T) naechster.Inhalt; naechster=null; return x; } else // Falls weder das jetztige noch das Nächste die Größten sind { return (T) naechster.pop(); } }
Eigentlich hatte ich erwartet, dass die Methode den Typ T zurückliefert, so wie ich den Rückgabewert deklariert habe.
Nur bei mir zeigt der Jbuilder an, dass der Rückgabewert von Typ Object wäre.Erzeuge ich beispielsweise einen Stack vom Typ double
GenericStack z= new GenericStack<Double>();
ist diese Anweisung trotzdem nicht möglich
Double c= z.pop();
Ps: Ich weiß, dass meine Implemation eines Stacks komisch ist, aber mein Lehrer hat uns das so vorgeschrieben
-
Sorry, falscher Threattitel.[cs]
-
hab mich verklickt und von java templates keine ahnung aber ist das hier
T x= (T) new Object();
korrekte semantik? ein neues basis objekt erstellen und das auf T casten? nach meinem verständnis müsste das eher
T x= new T();
heissen.
kann aber auch falsch sein
-
thordk: nö du hast wie immer unrecht.
op: frag mal lieber bei deinem lehrer nach, dein code is quatsch
-
Antwort schreiben schrieb:
thordk: nö du hast wie immer unrecht.
op: frag mal lieber bei deinem lehrer nach, dein code is quatschIn der Zeile soll eigentlich erzwungen werden, dass ein ein Objekt der Klasse T mit dem Standartkonstruktor instanziert wird.
T x= (T) new Object(); return x;
Aber meine eigentliche Frage ist, wie man Generics als Rückgabewert von Methoden behandeln kann.
-
1. Die Methode ist schon richtig deklariert, aber benutzt du die Referenz auf dein GenericStack auch richtig? Da muss der generische Typ immer angegeben werden:
GenericStack<Abc> stack = new GeneriStack<Abc>(); stack.push( new Abc() ); Abc abc = stack.pop();
2. Da Generics zur Laufzeit nicht bekannt sind, ist jeder Versuch, etwas wie "new T()" zu machen, sinnlos.
Ein "(T)new Object()" generiert ein ganz normales Object, und wird es später casten. Der einzige Effekt wird in diesem Fall eine ClassCastException sein.Allenfalls hilft dir eine Factory weiter:
public interface Factory<T>{ public T create(); }
public class GenericStack<T>{ private Factory<? extends T> factory; public GenericStack( Factory<? extends T> factory ){ this.factory = factory; } public T pop(){ ... T t = factory.create(); ... } }
Die Factory muss halt für jede Klasse noch implementiert werden.
-
Okay, danke, dank deiner Hinweise haben sich meine Probleme gelöst.
Bei 1) Hatte ich tatsächlich einen falschen Typen deklariert
und bei 2) Werde ich jetzt denke ich einfach Exceptions werfen lassen, damit nicht jede Klasse, die der Nutzer verwenden will, so eine create() Methode braucht.also, vielen dank