Data
hat zwei Parameter, E
, die letztlich eine Instanz von sich selbst sein muss, und S
, die Writer
eine Instanz der Lage sein muss von sich selbst (genauer gesagt, die gleiche Art von Instanz von sich spezifiziert durch E
). Schließlich qualifiziert sich Data<E,S>
auch als/erbt Fähigkeiten von Entity
parametrisiert durch die gleichen E
und S
(d. H. Entity
ist von Data<E,S>
und Writer<E>
).
Eine konkrete Implementierung könnte so etwas wie
NumericalData extends Data<NumericalData, NumWriter>
schauen, wo NumWriter
Geräte/Writer<NumericalData>
und NumericalData
auch als Entity<NumericalData, NumWriter>
qualifiziert erstreckt.
EDIT:
Warum so etwas wie das? Man möchte vielleicht generische Methoden in der abstrakten Klasse definieren, die auf einem Argument/return basieren, das die Kriterien Data<E,S>
erfüllt, aber auch in der Lage sein wollen, mit dem expliziteren Typ zurückzukehren/zu arbeiten. Zum Beispiel in Data<E,S>
könnte es
E doSomething(E toThis) { toThis.aDataClassMethod(); return toThis; }
sein Die Klasse kann den ersten Anruf tätigen, weil sie weiß, E
ist ein Data<E,S>
, und gibt den spezifischeren Typ, weil sie weiß toThis
ist ein E
.
Um ehrlich zu sein, sind rekursive Generika in der Regel der Weg zu clever. Sie können nützlich sein, aber oft sind sie einfach "ordentlich" und man versucht, das Problem um etwas Kluges zu lenken, anstatt umgekehrt.
Wenn ich ein Chef wäre ich denjenigen zu entlassen bin, der diesen Code geschrieben hat. Was zum Teufel ist das ? Man sollte auf den ersten Blick etwas verstehen –