【问题标题】:Type mismatch: cannot convert MyClass<E> to MyClass<E>类型不匹配:无法将 MyClass<E> 转换为 MyClass<E>
【发布时间】:2013-04-03 04:54:19
【问题描述】:

关于泛型和/或内部类,我缺少一些东西。我想用一个专门的迭代器编写一个专门的树类。 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&lt;V&gt; to ...FooTree&lt;V&gt;(两者都是同一个包)
哎呀!?
我可以通过添加一个演员来编译它: current = (FooTree)FooTree.this; 但为什么我必须首先这样做? 它是否试图变得“聪明”并认为第一个 V 可能与第二个 V 不同?

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

【问题讨论】:

    标签: java generics inner-classes


    【解决方案1】:

    试着做出你的声明:

    private class PreorderIterator implements Iterator<V>
    

    您的内部类中的&lt;V&gt; 是不必要的,在这种情况下也无济于事。

    实际发生的情况是PreorderIterator&lt;V&gt; 中的&lt;V&gt; 正在“隐藏”外部类中的&lt;V&gt;,因此尽管它们看起来是相同的类型参数,但它们实际上是不同的参数碰巧同名。

    【讨论】:

    • 谢谢!一旦我放弃了内部类也需要显式参数化的先入之见,我在探索时得到的所有错误和提示都会到位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多