假设我有以下内容:
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
或J
任何类。不幸的是,Java 不允许T super S
上面的构造。任何解决方法?