У меня есть такой простой интерфейс:
public interface Node<E extends Node<E>>
{
public E getParent();
public List<E> getChildren();
default List<E> listNodes()
{
List<E> result = new ArrayList<>();
// ------> is this always safe? <-----
@SuppressWarnings("unchecked")
E root = (E) this;
Queue<E> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty())
{
E node = queue.remove();
result.add(node);
queue.addAll(node.getChildren());
}
return result;
}
}
Я вижу, что this
всегда является экземпляром Node<E>
(по определению).
Но я не могу представить себе случай, когда this
не является экземпляром E
...
Поскольку E extends Node<E>
, Node<E>
также не должен быть эквивалентен E
по определению ??
Можете ли вы датьпример объекта, который является экземпляром Node<E>
, но это не экземпляр E
??
Между тем, мой мозг тает ...
ПредыдущийКласс был упрощенным примером.
Чтобы показать , почему Мне нужен самообязательный, я добавляю немного сложности:
public interface Node<E extends Node<E, R>, R extends NodeRelation<E>>
{
public List<R> getParents();
public List<R> getChildren();
default List<E> listDescendants()
{
List<E> result = new ArrayList<>();
@SuppressWarnings("unchecked")
E root = (E) this;
Queue<E> queue = new ArrayDeque<>();
queue.add(root);
while(!queue.isEmpty())
{
E node = queue.remove();
result.add(node);
node.getChildren()
.stream()
.map(NodeRelation::getChild)
.forEach(queue::add);
}
return result;
}
}
public interface NodeRelation<E>
{
public E getParent();
public E getChild();
}