Я пишу класс для бинарного дерева, и в интерфейсе дерева определяется эта функция:Java двоичное дерево, возвращающее тип для итератора по узлам, интерфейсу или классу?
/** Returns an iterable collection of the the nodes. */
public Iterable<Position<E>> positions();
Проблема заключается в том, что тип узла МОЯ класс, реализующий интерфейс позиции в задаче. Не сам интерфейс, позиция. Вот почему мне не удается возвратить итерируемый список узлов.
@Override
public Iterable<Position<E>> positions() {
ArrayList<Posisjon<E>> liste = new ArrayList<Posisjon<E>>();
liste = dumpings(liste,root);
System.out.println(liste.get(0));
return (Iterable<Position<E>>) liste.Iterator(); //PROBLEM HERE!
}
Я использую рекурсивную вспомогательную функцию для извлечения элементов и добавить их в ArrayList, а затем просто возвращает итератор для списка. «liste» здесь имеет тип my class «Posisjon», а ожидаемым возвратом для функции является интерфейс «Позиция». Почему я не могу использовать возвращаемый тип «Posisjon», поскольку он реализует интерфейс «Позиция»? Я также не могу изменить тип возврата, потому что тип возвращаемого значения указан в интерфейсе дерева, который я должен реализовать.
Вот интерфейс «Позиция» и мой класс «Posisjon» на случай, если он поможет вам понять проблему. (Интерфейс узла и класс Node, если вы это сделаете).
public interface Position<E> {
/** Return the element stored at this position. */
E element();
}
public class Posisjon<E> implements Position<E> {
private E element;
private Posisjon<E> parenten;
private Posisjon<E> rightChildren;
private Posisjon<E> leftChildren;
@Override
public E element() {
return element;
}
public E setElement(E ting){
E tmpElement = element;
this.element = ting;
return tmpElement;
}
public Posisjon<E> leftChild(){
return leftChildren;
}
public Posisjon<E> rightChild(){
return rightChildren;
}
public Posisjon<E> parent(){
return parenten;
}
public Posisjon(E element){
this.element = element;
}
public void setLeftChild(Posisjon<E> ting){
this.leftChildren = ting;
}
public void setRightChild(Posisjon<E> ting){
this.rightChildren = ting;
}
}
Это требует от меня изменения интерфейса, и мне не разрешено это делать. Если вы знаете другой способ сделать это, полагая, что должен быть другой способ, поскольку задача определена так, это было бы признательно. – Algific
@data_jepp Я подозреваю, что вы должны реализовать Iterable/Iterator напрямую. При необходимости я могу придумать пример. Я также замечаю, что вы возвращаете итератор, а не итерируемый (который будет сам liste). –