Java迭代器 - 试图让每个循环工作

时间:2010-03-28 18:31:30

标签: java iterator foreach

所以我有一个Tree<E>类,其中E是树所持有和组织的数据类型。我想像这样迭代树,或者以类似的方式迭代:

1.  Tree<String> tree=new Tree<String>();
2.  ...add some nodes...
3.  for (String s : tree)
4.      System.out.println(s);

虽然它在第3行给了我一个错误。

Incompatible types
    required: java.lang.String
    found:    java.lang.Object    

然而,以下工作正常并且正如预期的那样,对树执行正确的有序遍历并按原样打印每个节点:

for (TreeIterator<String> i = tree.iterator(); i.hasNext(); )
    System.out.println(i.next());


My Tree类看起来像这样:

public class Tree<E> implements java.lang.Iterable{
    ...
    public TreeIterator<E> iterator(){
        return new TreeIterator<E>(root);//return an iterator for the root node
    }
    ....
}


我的TreeIterator类看起来像这样:

public class TreeIterator<E> implements java.util.Iterator<E>{
    public E next(){
        ...
    }
    ...
}

但我想让for (String s : tree)循环正常工作 - 任何想法?这一点的重点是设置一个干净的foreach循环用于我的程序,而不是使用那个丑陋的for循环。

知道我做错了吗?


修改

根据best answer(以及之后不久发布的another equally good answer),以下内容使其成功:

更改

public class Tree<E> implements java.lang.Iterable{
    ....
}

public class Tree<E> implements java.lang.Iterable<E>{
    ....
}

...谢谢你们!

3 个答案:

答案 0 :(得分:5)

如果Tree<E>类也实现Iterable<E>接口,则foreach循环应该正常工作。您需要确保Iterator还返回通用类型E

答案 1 :(得分:4)

如果您希望它以通用方式与for循环一起使用,则Tree必须实现Iterable<E>(因此您的iterator()方法必须返回Iterator<E>

答案 2 :(得分:0)

您粘贴的代码中的for循环:

第3。 for(String s:tree)

错误地将树数据结构的元素类型转换为字符串的集合(或数组)。

我怀疑它应该看起来像:

for (String s : tree.getNodes()){...}

其中getNodes返回字符串集合。

不能肯定地说,直到您粘贴更多代码。