devo progettare un'interfaccia per l'entità gerarchica:interfaccia Progettare per un'entità gerarchica
interface HierarchicalEntity<T extends HierarchicalEntity<T>> {
T getParent();
Stream<T> getAncestors();
}
E 'abbastanza facile da implementare predefinita metodogetAncestors()
in termini di getParent()
in modo tale che il primo sarebbe tornato Stream
di tutti gli antenati
esempio di implementazione:
default Stream<T> getAncestors() {
Stream.Builder<T> parentsBuilder = Stream.builder();
T parent = getParent();
while (parent != null) {
parentsBuilder.add(parent);
parent = parent.getParent();
}
return parentsBuilder.build();
}
Ma ho bisogno di includere anche this
nel flusso, e qui appare un problema. La seguente riga non è corretto perché this
è di tipo HierarchicalEntity
, non T
:
parentsBuilder.add(this); // type mismatch!
Come posso ridisegnare l'interfaccia in modo da rendere getAncestors()
includono this
nel risultato?
Sfortunatamente questo non sarà mai completamente sicuro. Java non ha una sintassi di tipo autoreferenziale. Posso creare una 'classe Fake implementa HierarchicalEntity' e il tuo 'getAncestors' probabilmente fallirà con un' ClassCastException' alla fine. –
Ottenuto il punto. Forse qualche riprogettazione potrebbe essere applicata all'intera interfaccia. – Aliaxander
Basta lanciare 'this' a' T' e aggiungerlo al generatore di stream –