如何创建一个可以实例化多个对象并将它们放入列表的通用方法
How to create a Generic method that can instantiate multiple objects and put them into a 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(...)
但我似乎对数字有同样的问题。
提供一个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
;但如果没有,这将在编译时失败)
我正在尝试创建一个小函数,它将获取可变数量的对象、实例化它们并将它们添加到列表中。
我个人想将此用于 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(...)
但我似乎对数字有同样的问题。
提供一个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
;但如果没有,这将在编译时失败)