3

关于泛型和/或内部类,我缺少一些东西。我想用一个专门的迭代器编写一个专门的树类。FooTree 类如何具有返回 FooTree 类型的连续节点而不是 V 类型的节点值的迭代器?课程开始:

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>>;
}

由于 next() 必须返回一个 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> 两者都是同一个包)
Eh wot!?
我可以通过添加一个演员来编译它: current = (FooTree)FooTree.this; 但为什么我必须首先这样做?它是否试图变得“聪明”并认为第一个 V 可能与第二个 V 不同?

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

4

1 回答 1

5

尝试做出声明:

private class PreorderIterator implements Iterator<V>

<V>你的内部类中是不必要的,在这种情况下,没有帮助。

实际发生的情况是<V>inPreorderIterator<V>正在从外部类“隐藏” the <V>,因此尽管它们看起来是相同的类型参数,但它们实际上是碰巧具有相同名称的不同参数。

于 2013-04-11T05:22:39.053 回答