[英]Passing the Class<T> in java of a generic list?
我有一种从服务读取 JSON 的方法,我使用 Gson 进行序列化,并使用类型参数编写了以下方法。
public T getDeserializedJSON(Class<T> aClass,String url)
{
Reader r = getJSONDataAsReader(url);
Gson gson = new Gson();
return gson.fromJson(r, aClass);
}
我正在使用 json,它只返回一个类型的数组,例如
[
{ "prop":"value" }
{ "prop":"value" }
]
我有一个映射到这个对象的 java 类,我们称之为 MyClass。 但是要使用我的方法,我需要这样做:
RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);
但是,我无法弄清楚这样做的语法。 仅传递 ArrayList.class 不起作用。
那么有没有办法摆脱 Class 参数,或者如何获取 MyClass 的 ArrayList 的类?
您可以使用 Bozho 的解决方案,或使用以下方法避免创建临时数组列表:
Class<List<MyClass>> clazz = (Class) List.class;
此解决方案的唯一问题是您必须使用@SuppressWarnings("unchecked")
抑制未经检查的警告。
你不能。 你必须使用不安全的演员:
Class<List<MyClass>> clazz =
(Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
作为对此的跟进,我在 Gson 文档中找到了这个。
Type listType = new TypeToken<List<String>>() {}.getType();
这解决了安全获取类型的问题,但 TypeToken 类是特定于 Gson 的。
如果您使用的是SpringFramework
,则可以按如下方式使用ParameterizedTypeReference
:
restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
我有一个类似的场景,但我有一个解决方法来使用数组而不是 ArrayList
MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);
这里反序列化方法是做什么的
然后,您可以按如下方式继续执行列表:
List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
取决于您的要求,但如果您可以使用数组,则可以提供 Class: MyClass[].class
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.