Hallo,
Ich benötige in letzter Zeit etwas mehr Generics aber ich habe das Gefühl diese nicht korrekt verstanden zu haben.
Zumindest nach dem durchlesen von der Oracle Doc. Zudem komme ich dadurch auch zu fragen von Vererbung :O
1.) Warum muss ich wenn ich einer Methode etwas vom Typ T übergeben möchte auch einen "Rückgabewert" angeben obwohl es nur ein setter ist?
Bsp: <T extends IDate> void setDate(T date);
funktioniert ohne das vorangestellte <> nicht, weshalb wird es benötigt wenn es doch keine Rückgabe hat?
Oder ist das wirklich nur dafür da um, das T in der Signatur genau zu spezifizieren?
Und kann das dann nur ändern wenn ich auch bei der Klasse nen Generic hinzufüge.
2.) Bei einer Map muss man plötzlich ? angeben anstatt T damit es funktioniert.
Bsp.: Map<? extends IKey,? extends ITask> funktioniert, aber wieso auf einmal ? anstatt einfach nem T?
3.) Warum funktioniert das nicht:
Wenn ich sowas mache passt der erste Parameter, aber der zweite kann nicht applied werden. Und mir wird vorgeschlagen,dass der zweite Parameter in setFake nach Fake geändert wird. Sehe nicht weshalb das so ist.
Ich benötige in letzter Zeit etwas mehr Generics aber ich habe das Gefühl diese nicht korrekt verstanden zu haben.
Zumindest nach dem durchlesen von der Oracle Doc. Zudem komme ich dadurch auch zu fragen von Vererbung :O
1.) Warum muss ich wenn ich einer Methode etwas vom Typ T übergeben möchte auch einen "Rückgabewert" angeben obwohl es nur ein setter ist?
Bsp: <T extends IDate> void setDate(T date);
funktioniert ohne das vorangestellte <> nicht, weshalb wird es benötigt wenn es doch keine Rückgabe hat?
Oder ist das wirklich nur dafür da um, das T in der Signatur genau zu spezifizieren?
Und kann das dann nur ändern wenn ich auch bei der Klasse nen Generic hinzufüge.
2.) Bei einer Map muss man plötzlich ? angeben anstatt T damit es funktioniert.
Bsp.: Map<? extends IKey,? extends ITask> funktioniert, aber wieso auf einmal ? anstatt einfach nem T?
3.) Warum funktioniert das nicht:
Code:
class Fake implements IFake;
class Foo{
<T extends IFake> void setFake(Class<T> claa,T co);
}
init(){
Fake a = new Fake();
Foo.setFake(a.getClass(),a);
}
Wenn ich sowas mache passt der erste Parameter, aber der zweite kann nicht applied werden. Und mir wird vorgeschlagen,dass der zweite Parameter in setFake nach Fake geändert wird. Sehe nicht weshalb das so ist.