Java 如何创建一个可以实例化多个对象并将它们放入列表中的通用方法

Java 如何创建一个可以实例化多个对象并将它们放入列表中的通用方法,java,list,generics,immutability,Java,List,Generics,Immutability,我正在尝试创建一个小函数,它将接受数量可变的对象,实例化它们并将它们添加到列表中 我个人想用它来表示字符串,大十进制和长 我觉得我接近以下功能: <T> List<T> createGenericList(Class<T> clazz, T ...params) throws Exception { List<T> list = new ArrayList<T>(); for (T param : params) {

我正在尝试创建一个小函数,它将接受数量可变的对象,实例化它们并将它们添加到列表中

我个人想用它来表示
字符串
大十进制

我觉得我接近以下功能:

<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;
}
但不适用于
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(…)
,但我似乎对数字也有同样的问题。

为方法提供
函数

<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 createGenericList(函数为方法提供一个
函数

<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 createGenericList(函数我的目标是避免为我需要传递的每个附加参数键入
new
。我最初为每个对象都有单独的函数。鉴于3个不同的函数所做的事情几乎相同,我正在尝试了解是否有更简单的方法来做到这一点。我的目标是避免为我需要传递的每个附加参数键入
new
需要通过。我最初对每个对象都有单独的函数。鉴于3个不同的函数做了几乎相同的事情,我正在尝试了解是否有更简单的方法可以做到这一点。@Jornverne您可以,但您可能正在创建一个泛型数组。数组和泛型是不愉快的伙伴。我看到您在编辑。这两个版本是等效的,在编辑之前更简单。@cpp初学者否,它们不是等效的。您可以编写
class.createGenericList(func,Arrays.asList(subassofParamType))
使用我这里的代码,但不是以前的代码。好吧,这是真的,但这样做没有意义,因为您可以通过编写正确的类型参数来编译它。它们是等效的,因为它们都接受完全相同的参数对(假设您编写了正确的类型参数)。证明这一点的方法是编写两个具有不同签名的方法,然后将每个方法的主体更改为只调用另一个。因为两个调用都是编译的(我检查了这个)这意味着第二个签名实际上并不比第一个更一般。@jornverne您可以,但您可能正在创建一个泛型数组。数组和泛型是不愉快的伙伴。我看到您在编辑中更改了签名。这两个版本是等效的,编辑之前更简单。@cpp初学者不,它们不是等效的。Y您可以编写
class.createGenericList(func,Arrays.asList(subassofParamType))
使用我这里的代码,但不是以前的代码。好吧,这是真的,但这样做没有意义,因为您可以通过编写正确的类型参数来编译它。它们是等效的,因为它们都接受完全相同的参数对(假设您编写了正确的类型参数)。证明这一点的方法是编写两个具有不同签名的方法,然后将每个方法的主体更改为只调用另一个。由于两个调用都是编译的(我检查了这一点),这意味着第二个签名实际上并不比第一个签名更一般。
List<ParamType> params = Arrays.asList(param1, param2);
List<SomeType> list = createGenericList(SomeType::new, params);