java - 类型不匹配 : cannot convert MyClass<E> to MyClass<E>

标签 java generics inner-classes

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

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,如接口(interface)中声明的那样,我添加了 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>在你的内部类中是不必要的,在这种情况下,没有帮助。

实际发生的是 <V>PreorderIterator<V>正在“隐藏”<V>来自您的外部类,因此尽管它们看起来像是相同类型的参数,但实际上它们是恰好具有相同名称的不同参数。

关于java - 类型不匹配 : cannot convert MyClass<E> to MyClass<E>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941265/

相关文章:

c# - 改用泛型类型参数重载?

c# - 为什么这段代码要用 long 代替 float 呢?

java - 从另一个类的方法中调用 mutator

java - 静态变量值

java - 如何在 JSON 正文中扩展和对象?

java - OSGi 与 JPA : Service not starting although code seems ok

C# 泛型和使用类型化方法的非泛型版本

java - 如何更改redirect.jsp以查看我的自定义jsp页面而不是index.jsp

java - 响应式创建 Eclipse 上下文子菜单

c# - 努力想出一个通用的 C# 方法来比较不同类型的数字对象