如何创建可以实例化多个对象并将它们放入List中的Generic方法

时间:2017-10-24 15:43:54

标签: java list generics immutability

我试图创建一个小函数,它将获取可变数量的对象,实例化它们并将它们添加到List中。

我个人希望将其用于StringBigDecimalLong

我觉得我接近以下功能:

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

但不适用于BigDecimalLong

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(...),但我似乎对数字有同样的问题。

1 个答案:

答案 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;但如果没有,则会在编译时失败)

相关问题