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



关于泛型和/或内部类,我缺少一些东西。我想写一个专门化的树类,带专门化的迭代器。类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>(两者是同一个包)
嗯知道! ?
我可以通过添加强制转换使其编译:current = (FooTree)FooTree.this;但我为什么要这么做呢?它是否试图变得"聪明",并认为第一个V可能与第二个V不同?

正确的方法是什么?

试着声明一下:

private class PreorderIterator implements Iterator<V>

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

实际情况是,PreorderIterator<V>中的<V>"遮蔽"了来自外部类的<V>,因此,尽管它们看起来是相同的类型参数,但它们实际上是碰巧具有相同名称的不同参数。

最新更新