我正在写一个类的二进制树,并在树接口这个函数的定义: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;
}
}
这确实需要我改变界面,我不允许这样做。如果你知道另一种方式来做到这一点,假设自从任务被定义为这样以后必定有另一种方式,那将是值得赞赏的。 – Algific 2009-10-13 20:32:40
@data_jepp我怀疑你应该直接实现Iterable/Iterator。如果需要的话,我可以试着想出一个例子。我还注意到你正在返回一个迭代器,而不是一个迭代器(它本身就是侦听器)。 – 2009-10-13 20:39:05