2013-04-11 119 views
3

有些东西我缺少泛型和/或内部类。我想用专门的迭代器编写一个专门的树类。 FooTree类如何有一个迭代器来返回类型为FooTree的连续节点而不是类型V的节点值?该类开始:类型不匹配:无法将MyClass <E>转换为MyClass <E>

public class FooTree<V> 
    private final V value; 
    private FooTree<V> left; 
    private FooTree<V> right; 

我将Iterator类作为内部类,因为没有人会关心它。在FooTree定义获得的迭代器工厂方法是:

public Iterator<FooTree<V>> preorderIterator() { 
    return this.new PreorderIterator<FooTree<V>>; 
} 

由于下一个()必须返回一个V,如在接口中声明,我添加nextNode()来获得周围的返回类型。内部类开始:

private class PreorderIterator<V> implements Iterator<V> { 
    private FooTree<V> current; 
    . . . 
    public FooTree<V> nextNode() { 
     current = FooTree.this;      ** 

我得到这个美好的编译器错误:
Type mismatch: cannot convert from ...FooTree<V> to ...FooTree<V>(两者是相同的封装)
诶!?WOT
我可以通过添加一个cast来编译它:current =(FooTree)FooTree.this; 但是我为什么要首先呢? 它试图成为“聪明”,并计算出第一个V可能不同于第二个V?

这样做的正确方法是什么?

回答

5

尝试使你的宣言:

private class PreorderIterator implements Iterator<V> 

<V>在你的内部类是不必要的,在这种情况下,无益的。

所发生的情况是,在PreorderIterator<V><V>从你的外部类“阴影”的<V>,这样虽然它们看起来像它们是相同的类型参数,他们碰巧具有相同的实际不同的参数名称。

+0

谢谢!一旦我放弃内心阶层也需要明确参数化的偏见,我在探索时所得到的所有错误和提示都将落实到位。 – 2013-04-11 16:17:54

相关问题