2

Java の任意の型をサポートするイテレータのイテレータを作成しようとしています。目的は、反復子のオブジェクトを反復処理することです。

しかし、型の不一致があり、実装を初期化する方法がわかりません。

私が念頭に置いていた最初のアイデアは、クラスを実装するIterator<Iterator<T>>ことでしたが、次のメソッドにはpublic Iterator<T> next()私がやりたいことに対応しない署名があるため、これは機能しません。を返す代わりにIterator<T>、型を返したいですT

そこで、Iterator インターフェイスに非常によく似た別のインターフェイスを作成します。

  public interface MyIterator<T extends Iterator<T>> {

    public boolean hasNext();

    public T next();
}

私のイテレータは、イテレータである型 T を取ります。これが私の実装です(削除なし):

public class IteratorOfIterator<T extends Iterator<T>> implements MyIterator<T> {

private T[] iterators;

private T currentIterator;

private int currentIndex;

public IteratorOfIterator(T[] iterators){
    this.iterators = iterators;
    this.currentIndex = 0;
    this.currentIterator = iterators[currentIndex];
}

public boolean hasNext() {
    return currentIndex < iterators.length - 1 || currentIterator.hasNext();
}

public T next() {
    if(!this.currentIterator.hasNext()){
        currentIndex++;
        this.currentIterator = iterators[currentIndex];
    }
    return currentIterator.next();
}

イテレータをテストしたいが型が一致しない場合、どのように初期化できますか? これが私がやりたい例です:

String[] strings = {"peanut","butter","coco","foo","bar"};

Object[] iterators = {strings};

MyIterator<String> myIterator = new IteratorOfIterator<String>(iterators); // <-- in this line

エラーは言う:Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Iterator<T>> of the type IteratorOfIterator<T> IteratorOfIterator.java

どうすればこの問題を解決できますか? アドバイスありがとうございます。

PS: 私は問題を完全に理解しています。たとえば、型 String は MyIterator インターフェイスを実装していないことを理解しています。これが、適切な代替ではない理由です。私の問題は、どうすればいいのかわからないことです

4

4 に答える 4

3

これはうまくいきません。

public interface MyIterator<T extends Iterator<T>>

これはT、それ自体でなければならないことを意味しIteratorます。

T を特定の型に制限したくありません。

public interface MyIterator<T>

しかし、イテレータを型にしたいIterator<T>

public class IteratorOfIterator<T> implements Iterator<T> {

private Iterator<T>[] iterators;

private Iterator<T> currentIterator;

private int currentIndex;

public IteratorOfIterator(Iterator<T>[] iterators){
    this.iterators = iterators;
    this.currentIndex = 0;
    this.currentIterator = iterators[currentIndex];
}

Iteratorそのため、代わりに使用できますMyIterator

于 2013-04-30T10:24:17.643 に答える
0

使用できます

Iterator<String> myIterator = Arrays.asList(strings).iterator();

Java 配列から反復子を直接取得する標準的な方法はないため、最初にそれを に変換するかList、配列用の独自の反復子を構築することができます。

于 2013-04-30T10:23:06.833 に答える