Ich versuche, eine Hierarchie von Klassen zu erstellen, beginnend mit einer abstrakten Klasse mit einem generischen Typ. Und dann verwenden Sie einen erweiterten Typ des Generic in der 2. Generation von Kinderklassen. Da ich ziemlich sicher bin unklar, das ist, hier ein Beispiel:Java-Generics-Hierarchie
Die Idee wäre, eine Tabelle mit Elementen haben, also im Grunde:
abstract class AbstractTableOfItems<T>
-> Die allgemeine Art der Tabelle
class Foo
-> Eine Art von Artikel
class Bar
-> Eine andere Art zum Produkt
class SonOfFoo extends Foo
class TableOfFoo extends AbstractTableOfItems<Foo>
class TableOfBar extends AbstractTableOfItems<Bar>
So weit, so gut, alles ist in Ordnung (lassen Sie sich über den Inhalt der Klassen nicht kümmern, es ist nicht der Punkt hier).
Aber dann möchte ich eine Tabelle SonOfFoo
und ich möchte es TableOfFoo
erweitern, da SonOfFoo
von Foo
erbt. Dies scheint nicht möglich zu sein. Vielleicht denke ich in die falsche Richtung, aber ich verstehe einfach nicht warum.
class TableOfSonOfFoo extends TableOfFoo
compiliert ist aber falsch, weil es immer noch eine Tabelle von Foo
, der generischen Typ verwendet Foo
sein würde.
class TableOfSonOfFoo extends TableOfFoo<SonOfFoo>
nicht nicht kompiliert, da der generische Typ auf dem AbstractTableOfItems
ist.
Also ok ich sagen, wollen wir versuchen, TableOfFoo
neu zu definieren, so kann es akzeptieren Vererbung:
class TableOfFoo extends AbstractTableOfItems<? extends Foo>
wieder falsch: „Ein Supertyp darf keine Wildcard angeben“ (Ich bin nicht sicher, ob ich voll und ganz verstehen dieses).
Ich kann AbtractTableOfItems
nicht berühren, da es nicht so allgemein sein würde, wie ich will. Also bin ich hier irgendwie festgefahren. Ich verstehe, es würde funktionieren, nur TableOfSonOfFoo
erben direkt von AbstractTableOfItems
, aber dann würde ich alle Implementierungen verlieren von TableOfFoo
.
Ich könnte dies umgehen, aber ich versuche, an eine Hierarchie zu denken und zu verstehen, warum das nicht funktioniert.
Ich weiß, aber ich gab eine Alternative zu diesem Teil seiner Frage 'class TableOfFoo erweitert AbstractTableOfItems erweitert Foo> '. Ich denke nicht, dass die ganze Frage leicht zu beantworten ist. –
Danke, das scheint zu funktionieren. Der Nachteil ist, dass ich jedes Mal, wenn ich den Typ "F" und die Klasse TableOfFoo verwende, explizit auf Foo umstellen muss, während es vorher implizit war. Aber es funktioniert tatsächlich so. "Vielleicht möchten Sie Ihr Design überprüfen und sehen, ob Sie Dinge vereinfachen könnten, indem Sie Aggregation statt Vererbung verwenden." Vielleicht bin ich mir in der Tat nicht so sicher über die Relevanz dieses Designs. – Zazou
@ Zazou das klingt nicht richtig. Sie sollten kein Casting benötigen, wenn Sie Generika korrekt verwenden. Vielleicht sollten Sie eine Folgefrage für diese –