0

次のものがあるとします。

interface I {
    // some getters and setters
}

class A implements I {
    // some methods
}

class B implements I {
    // some methods
}

interface J {
    // some getters and setters
}

class C implements J {
    // some methods
}

class D implements J {
    // some methods
}

これらの行に沿ってジェネリック関数を定義できるようにしたいと思います:

static <S, T super S> List<T> f(String data, Class<S> sClass, Class<T> tClass) {
    List<T> lst = new ArrayList<>();
    S item = sClass.getInstance();  // try/catch omitted for brevity
    // set some fields of item based on data
    lst.add(item);  // this is allowed, since T super S
    return lst;
}

で使えるように

String s = "some data";
List<I> iLst = f(s, A.class, I.class);
iLst = f(s, B.class, I.class);
List<A> aLst = f(s, A.class, A.class);
List<B> bLst = f(s, B.class, B.class);

List<J> jLst = f(s, C.class, J.class);
jLst = f(s, D.class, J.class);
List<C> cLst = f(s, C.class, C.class);
List<D> dLst = f(s, D.class, D.class);

言い換えれば、返されたリストの要素タイプを明示的に作成せずにパラメータ化したいと思いIますJT super S残念ながら、Java では上記の構文を使用できません。回避策はありますか?

4

0 に答える 0