2009-10-13 37 views
0

我正在写一个类的二进制树,并在树接口这个函数的定义:Java二叉树,返回节点,接口或类的迭代器的类型?

/** Returns an iterable collection of the the nodes. */ 
    public Iterable<Position<E>> positions(); 

的问题是,该节点的类型是MY类实现在任务的位置接口。不是界面本身,位置。这就是为什么我无法返回节点的迭代列表。

@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,然后就返回迭代器列表。这里的“聆听”是我的类“Posisjon”的类型,函数的预期返回值是“位置”接口。为什么我不能只使用返回类型“Posisjon”,因为它正在实现接口“Position”?我也不能改变返回类型,因为返回类型是在我必须实现的树接口中指定的。

这里是界面“位置”和我的班级“Posisjon”,以防止它帮助你理解问题。 (如果您愿意,可以使用节点接口和节点类)。

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 2009-10-13 20:32:40

+0

@data_jepp我怀疑你应该直接实现Iterable/Iterator。如果需要的话,我可以试着想出一个例子。我还注意到你正在返回一个迭代器,而不是一个迭代器(它本身就是侦听器)。 – 2009-10-13 20:39:05

0

你应该定义你的方法为:

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