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