我试图创建一个小函数,它将获取可变数量的对象,实例化它们并将它们添加到List中。
我个人希望将其用于String
,BigDecimal
和Long
。
我觉得我接近以下功能:
<T> List<T> createGenericList(Class<T> clazz, T ...params) throws Exception {
List<T> list = new ArrayList<T>();
for (T param : params) {
Constructor<T> ctor = clazz.getConstructor(clazz);
T instance = constructor.newInstance(param);
list.add(instance);
}
return list;
}
这适用于String
:
createGenericList(String.class,"a","b")
但不适用于BigDecimal
或Long
createGenericList(BigDecimal.class,10,10);
因为Java正在将我的数字读作int
。施放似乎也不起作用。
no instance(s) of type variable(s) exist so that Integer conforms to BigDecimal
inference variable T has incompatible bounds:
equality constraints: BigDecimal
lower bounds: Integer
我也在看ImmutableList.of(...)
,但我似乎对数字有同样的问题。
答案 0 :(得分:3)
为方法提供Function<P, T>
:
<P, T> List<T> createGenericList(Function<? super P, ? extends T> func, List<? extends P> params) throws Exception {
List<T> list = new ArrayList<T>();
for (P param : params) {
T instance = func.apply(param);
list.add(instance);
}
return list;
}
然后调用:
List<ParamType> params = Arrays.asList(param1, param2);
List<SomeType> list = createGenericList(SomeType::new, params);
(假设SomeType
有一个构造函数只占用一个ParamType
;但如果没有,则会在编译时失败)