11

これは、実際のコードを簡略化するために作成した例であるため、少し不自然である場合は申し訳ありません。私がやりたいことは、ネストされた 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であることを知っているので、それは領土に合っていますが、これに対する解決策があったかどうかは興味があります.

4

3 に答える 3