我遗漏了关于泛型和/或内部类的东西。我想用专门的迭代器编写一个专门的树类。类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不同吗?
这样做的正确方法是什么?
答案 0 :(得分:5)
尝试做出声明:
private class PreorderIterator implements Iterator<V>
你的内部类中的<V>
是不必要的,在这种情况下,没有帮助。
实际上发生的事情是<V>
中的PreorderIterator<V>
是从您的外部类别“遮蔽”<V>
,所以虽然它们看起来像是相同的类型参数,但它们实际上不同的参数碰巧具有相同的名称。