Я должен разработать интерфейс для иерархической сущности:Проектирование интерфейса для иерархической сущности
interface HierarchicalEntity<T extends HierarchicalEntity<T>> {
T getParent();
Stream<T> getAncestors();
}
Это довольно легко реализовать по умолчанию методgetAncestors()
с точки зрения getParent()
таким образом, что бывший вернется Stream
из все предки.
Пример реализации:
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 не имеет синтаксиса типа self-referential. Я могу создать «класс Fake реализует HierarchicalEntity», и ваш 'getAncestors', по-видимому, с ошибкой ClassCastException. –
Понял. Возможно, какой-то редизайн можно применить ко всему интерфейсу. – Aliaxander
Просто введите 'this' в' T' и добавьте его в построитель потока –