7

これは不可能のように見えますが、この問題を回避する賢い方法を知っている人はいますか?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>

whereSは不明なタイプのインターフェースであると想定されてSomeClassおり、行インデックスを持つ 2D 配列であり、双方向の JDBC 結果セットと機能的に似ています。のサブクラスにSomeClassは、列ごとにカスタムのゲッターとセッターがあります。リストと同じように、この構造を反復処理できるようにしたいと考えています。SomeClassgetter と setter にアクセスできるように、my と Bean の間に共通のインターフェイスを実装したいと考えています。そのため、S はそのインターフェイスである必要があります。ただし、私が提供した宣言は機能しません。これを回避する方法はありますか?

編集して、目的の実装を表示します。

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>{

T object;

public SomeClassWrapper(T object){
    this.object = object;
}

@Override
public Iterator<S> iterator() {
    object.setIndex(-1);
    return new SomeClassIterator<S>();
}

private class SomeClassIterator<S> implements Iterator<S> {

    @Override
    public boolean hasNext() {
        return object.index() < object.rowSize() - 1;
    }

    @Override
    public S next() {
        object.next();
        //safe because only interface methods allowed, can't further manipulate index
        return object; 
    }

    @Override
    public void remove() {
        object.deleteRow();
    }
}
4

3 に答える 3

0

でパラメータ化できませんSomeClassS? その後、あなたが持つことができます

public class SomeClassIterableWrapper<S, T extends SomeClass<S>> 
      implements Iterable<S>{
于 2012-05-24T14:21:43.743 に答える
0

S の S は SomeClass と S を拡張すると思います

パブリッククラス SomeClassIterableWrapper

このコンテキストでは、S は何かを拡張するクラスでなければならないため、明確なクラスでなければなりません。

S の代わりに使用される可能性のあるクラスを絞り込む方法はありますか? T が拡張する複数のクラスがある場合は、複数のアンパサンドを使用できます

于 2012-05-24T17:28:04.627 に答える
-1

私は問題を完全には理解していないことを告白しますが、これが私が提案することです:のインターフェースを作成しますS。オブジェクトを返すメソッドとSオブジェクトが1つ含まれています。

public interface SWrapper<S> {

  S getS();

}

次に、実装を作成します。

public class SImpl implements SWrapper<SImpl> {

    @Override
    public SImpl getS() {
        return this;
    }

}

これで、次を作成できます。

public class SomeClass<T extends SomeClass & SWrapper<T>> {

    private final T object;

    public SomeClass(T object) {
        this.object = object;
    }
}

使用法を少し変更する必要がありますが、おそらくそれは機能します。

于 2012-05-24T16:11:57.170 に答える