これは、実際のコードを簡略化するために作成した例であるため、少し不自然である場合は申し訳ありません。私がやりたいことは、ネストされた 1 つの型引数から 2 つの型パラメーターを効果的に取得することです。これは不可能だと確信していますが、試してみようと思いました。
//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);
そして、私の実世界のケースでは、私のジェネリックは、次のようにimplements句で指定できる場合があります
public class Bar implements Baz<String>
2 番目の型パラメーターを指定しなければならないことは、実装の詳細が目の前に投げ出されるように感じられるため、さらに苦痛です。言わなければならない
Foo<Bar,String>
String と Bar の間にすでに関係がある場合は、エレガントではないように見えます。私はそれがJavaであることを知っているので、それは領土に合っていますが、これに対する解決策があったかどうかは興味があります.