2012-05-24 9 views
7

これは不可能なようですが、誰もこの問題を巧みに克服できますか? Sは、いくつかの未知のタイプのインタフェースとSomeClassことになっているジェネリックタイプをインターフェイスにするのは強制的ですか?

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

双方向JDBC結果と機能的に同様の行インデックスを有する2次元アレイです。 SomeClassのサブクラスには、各列に対してカスタムgetterとsetterがあります。私はリストのようにこの構造を反復することができるようにしたい。私はSomeClassとBeanとの間にgetterとsetterにアクセスできる共通のインタフェースを実装したいと考えています。したがって、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(); 
    } 
} 
+2

とはどういう意味ですか? Javaは多重継承をサポートしていません。 TがSomeClassを拡張し、Sを実装することを保証しますか? –

+0

説明のように、Sはインターフェイス –

+1

@ LudwigMagnussonであり、 'X'がクラスであるかインタフェースであるかにかかわらず、ジェネリック型パラメータ定義内でのみ' extends X'を使うことができます。 –

答えて

0

あなたはSSomeClassのパラメータを設定することはできません:

編集は私の希望の実装を表示するには?そして、あなたは私が問題を完全に理解していないことを告白

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

私はSomeClassをまったく異なるソリューションとしてパラメータ化することを検討しています。 SomeClassがIterable自体を実装するもの。しかし、SomeClassは既存のコードベースで多く使われているので、私はこのソリューションを使いたくありません。 –

+0

継承の代わりに合成を使うことも考えられます。既存のサブクラスは代わりに 'SomeClass'への参照を保持し、パラメータ化することができます。 – artbristol

-1

を持つことができますが、これは私がお勧めです: Sのインターフェースを作成します。それはSオブジェクトを返す1つのメソッド広告を含んでいます。

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; 
    } 
} 

public interface SWrapper<S> { 

    S getS(); 

} 

は、次に実装を作成します。この文脈で、 Sが何かを拡張したクラスである必要がありますので、

0

私はSでは工ass & Sを拡張して考える

パブリッククラスSomeClassIterableWrapper

は明確なクラスである必要があります。

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

+0

はい、問題を正しく識別します。残念ながら、インタフェースSの数は、絞り込むことのできるものではなく、実際には時間の経過とともにしか成長しません。 –

関連する問題