类型不匹配:无法将MyClass <E>转换为MyClass <E>

All*_*rry 3 java generics inner-classes

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

public class FooTree<V>
   private final V value;
   private FooTree<V> left;
   private FooTree<V> right;
Run Code Online (Sandbox Code Playgroud)

我让Iterator类成为一个内部类,因为没有其他人会关心它.在FooTree中定义的获取迭代器的工厂方法是:

public Iterator<FooTree<V>> preorderIterator() {
    return this.new PreorderIterator<FooTree<V>>;
}
Run Code Online (Sandbox Code Playgroud)

由于next()必须返回一个V,如接口中声明的那样,我添加了nextNode()来绕过返回类型.内部类开始:

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

我得到了这个奇妙的编译器错误:(
Type mismatch: cannot convert from ...FooTree<V> to ...FooTree<V> 两者都是相同的包)
呃哇!?
我可以通过添加一个强制转换来编译:current =(FooTree)FooTree.this; 但是我为什么要首先要这样做?它试图变得"聪明"并且认为第一个V可能与第二个V不同吗?

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

Sim*_*son 5

尝试做出声明:

private class PreorderIterator implements Iterator<V>
Run Code Online (Sandbox Code Playgroud)

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

实际发生的是,<V>in PreorderIterator<V>正在<V>从你的外部类中"遮蔽" ,所以尽管它们看起来像是相同的类型参数,但实际上它们实际上是具有相同名称的不同参数.