Data
ha due parametri, E
che deve in definitiva essere un'istanza di se stesso, e S
che deve essere in grado di Writer
un'istanza di per sé (in particolare, lo stesso tipo di istanza di se stesso specificato da E
). Infine, Data<E,S>
qualifica anche come/eredita capacità dalle Entity
parametrizzate dalla stessa E
e S
(cioè, Entity
è di Data<E,S>
e Writer<E>
).
Una concreta attuazione potrebbe essere simile
NumericalData extends Data<NumericalData, NumWriter>
dove NumWriter
attrezzi/estende verso Writer<NumericalData>
e NumericalData
qualifica anche come un Entity<NumericalData, NumWriter>
.
MODIFICA:
Perché fare qualcosa del genere? Si potrebbe voler definire metodi generici nella classe astratta che si basano su un argomento/ritorno che soddisfano i criteri Data<E,S>
, ma vogliono anche essere in grado di restituire/lavorare con il tipo più esplicito. Per esempio, in Data<E,S>
, ci potrebbe essere
E doSomething(E toThis) { toThis.aDataClassMethod(); return toThis; }
La classe può fare la prima chiamata, perché sa E
è un Data<E,S>
, e restituire il tipo più specifico perché sa toThis
è un E
.
Per essere onesti, i generici ricorsivi sono tipicamente la strada troppo intelligente. Possono essere utili, ma molte volte sono semplicemente "ordinate" e si cerca di piegare il problema su qualcosa di intelligente piuttosto che viceversa.
Se fossi un boss mi respingere colui che ha scritto questo codice. Che diavolo è quello ? Uno dovrebbe capire qualcosa a prima vista –