gpt4 book ai didi

java - 使用 Java 泛型显式指定返回的集合类型和集合元素的类型

转载 作者:行者123 更新时间:2023-12-01 13:20:19 25 4
gpt4 key购买 nike

正如标题所说。

假设我有一个方法可以将 JSON 数组字符串转换为 Java 集合,并且它可以指定集合中元素的类型。
例如:

// variable 'json' is a String, like "[{...}, {...}, ...]"
List<Person> persons = MyUtil.convert(json, List.class, Person.class);
Set<Address> set = MyUtil.convert(json, Set.class, Address.class);

目前我定义的方法签名是这样的:
public static <C extends Collection<E>, E> C convert(String content, Class<C> collectionClass, Class<E> elementClass) {
....
}

当我使用这个方法时有一个警告:

Unchecked assignment: 'java.util.List' to 'java.util.List<my.package.Person>'



我可以理解为什么会出现这个警告,但我不知道如何优化我的方法签名。 (除了使用@SuppressWarnings)

我可以显式声明返回的集合及其元素的类型吗?
也许它看起来像这样:
public static C<E> convert(String content, Class<C> collectionClass, Class<E> elementClass) {
...
}

(当然,我知道完全无法编译,我只是想举个例子。)

非常感谢 Donat's answer .
我尝试了两种方式:

private static <C extends Collection<E>, E> C convert(String content, Supplier<C> supplier, Class<E> element) {
...
}

private static <C extends Collection<E>, E> C convert(String content, Class<C> collection, Class<E> element) {
...
}

调用他们:

List<Person> l0 = convert("...", ArrayList::new, Person.class);  // No warning
List<Person> l1 = convert("...", ArrayList.class, Person.class); // Unchecked warning

是的,问题解决了,但我仍然很困惑。这两个方法的返回值声明是一样的。为什么它们会导致不同的结果?

最佳答案

您最好将集合工厂传递给该方法。

public static <C extends Collection<E>, E> C convert(String content, Supplier<C> collectionFactory, Class<E> elementClass) {
C collection = collectionFactory.get();
...
return collection;
}

例如,您可以像这样调用它:
List<Integer> list = convert("", ArrayList::new, Integer.class);

使用供应商的主要原因是:对于一个类,很难在方法体中创建一个新实例。您不能依赖于无参数构造函数的存在。您将收到未经检查的警告,或者必须使用要抛出的异常来扩展签名。

为什么在调用您的方法时出现未经检查的警告?这是因为您必须传递一个类型为 Class<ArrayList<Integer>> 的类。在我的例子中。但这毫无意义。我认为 Class 的类型变量必须是真正的类(可具体化),如 ArrayList .没有像 ArrayList<Integer> 这样的类因为泛型将被编译器删除。所以这个类值无法与 e 区分开来。 G。 ArrayList<String> .

关于java - 使用 Java 泛型显式指定返回的集合类型和集合元素的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61381608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com