2009-10-13 2 views
0

Я пишу класс для бинарного дерева, и в интерфейсе дерева определяется эта функция: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; 
    } 
} 

ответ

1

Вы хотите

public Iterable<? extends Position<E>> positions(); 

Есть very good reasons почему Iterable<A> не распространяется Iterable<B> когда A распространяется B. Решение на Java должно использовать подстановочные знаки, как указано выше.

+0

Это требует от меня изменения интерфейса, и мне не разрешено это делать. Если вы знаете другой способ сделать это, полагая, что должен быть другой способ, поскольку задача определена так, это было бы признательно. – Algific

+0

@data_jepp Я подозреваю, что вы должны реализовать Iterable/Iterator напрямую. При необходимости я могу придумать пример. Я также замечаю, что вы возвращаете итератор, а не итерируемый (который будет сам liste). –

0

Вы должны определить свой метод, как:

public Iterable<? extends Position<E>> positions(); 
Смежные вопросы