3

ジェネリックおよび/または内部クラスについて欠けているものがあります。特殊なイテレータを使用して、特殊なツリー クラスを作成したいと考えています。クラス FooTree は、V 型のノード値ではなく、FooTree 型の連続するノードを返す反復子をどのように持つことができますか? クラスが始まります:

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 が 2 番目の V とは異なる可能性があると考えていますか?

これを行う正しい方法は何ですか?

4

1 に答える 1

5

あなたの宣言をしてみてください:

private class PreorderIterator implements Iterator<V>

内部クラスの<V>は不要であり、この場合は役に立ちません。

実際に起こっているのは、<V>inPreorderIterator<V>が外部クラスの を「シャドウイング」して<V>いるため、同じ型パラメーターのように見えますが、実際にはたまたま同じ名前を持つ異なるパラメーターです。

于 2013-04-11T05:22:39.053 に答える