ジェネリックおよび/または内部クラスについて欠けているものがあります。特殊なイテレータを使用して、特殊なツリー クラスを作成したいと考えています。クラス 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 とは異なる可能性があると考えていますか?
これを行う正しい方法は何ですか?