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

换句话说,我想参数化返回列表中的元素类型,而不是显式地创建它IJ任何类。不幸的是,Java 不允许T super S上面的构造。任何解决方法?

4

0 回答 0