interface HierarchicalEntity<T extends HierarchicalEntity<T>> {
T getParent();
Stream<T> getAncestors();
}
それは前者がのStream
を返すようにgetParent()
の面でデフォルトgetAncestors()
メソッドを実装するのは非常に簡単ですすべての祖先。
実装例:
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();
}
しかし、私はまた、ストリームにthis
を含める必要があり、ここで問題が表示されます。 this
はタイプHierarchicalEntity
、ないT
であるため 次の行が正しくありません:
parentsBuilder.add(this); // type mismatch!
どのように私はgetAncestors()
が結果にthis
を含めるようにするためにインターフェースを再設計することができますか?
残念ながら、これは完全な型の安全ではありません。 Javaには自己参照型構文がありません。 'Fake implements HierarchicalEntity'を作成すると 'getAncestors'はおそらく最終的に' ClassCastException'で失敗します。 –
ポイントを得ました。多少の再設計がインタフェース全体に適用される可能性があります。 – Aliaxander
'T'に' this'をキャストしてストリームビルダーに追加してください –