これは私が実際のコードを簡略化した例です。少し工夫すれば謝ります。私がしたいのは、単一の入れ子型引数の中から2つの型パラメータを効果的に取得することです。私はこれが不可能だと確信していますが、私はそれを撃つと思っていました。Javaのネストされた型のパラメータ
//Not legal java code
public class Foo<C extends Collection<T>> { //where T is another type parameter
private C coll;
public Foo(C coll) {
this.coll = coll;
}
public void add(T elem){
this.coll.add(elem);
}
//UPDATED TO ADD GETTER
/**
* I may need to retrieve the collection again, or pass it
* on to another function that needs the specific C type
*/
public C getColl(){
return coll;
}
}
...
List<String> strings = new ArrayList<String>();
Foo<List<String>> foo = new Foo<List<String>>(strings);
foo.add("hello");
私は別の型パラメータを追加することによってそれを行うことができることを知っている:
public class Foo<C extends Collection<T>,T>
が、その後、私は冗長を追加する必要があります。
Foo<List<String>,String> foo = new Foo<List<String>,String>(strings);
そして、私の現実世界のケースでは、私のジェネリックは、ときどき
のように指定することができますpublic class Bar implements Baz<String>
第2の型のパラメータは、それが私の顔に実装の詳細をスローするように感じるため、さらに痛いと指定する必要があります。文字列とバーとの間の関係がすでに存在するとき
Foo<Bar,String>
を言うために持つことは、単に洗練ようです。私はそのJavaを取得するので、それは領土と一緒に行くが、これのための解決策があるかどうか不思議です。
です。ファクトリメソッドの考え方は面白いですが、私のコードでは常に同じであることが指示されていますが、型が2回指定されているということはなおも気になります。 –
@RusselLeggett、OK、そうすれば不変性が必要です。コレクションNoはありませんか?うんそれは痛みです。私のアドバイスは、あなたのライブラリの複雑さに対処し、戻り値の型が 'FooのFactoryがCompleicatedFoo 、T>'を継承するようにして、クライアントが単一パラメータのバージョンを使うことができるようにすることによって簡潔なAPIを公開することです。 –