通过Class在java中的通用列表?

发布于 2024-09-01 01:08:39 字数 765 浏览 6 评论 0原文

我有一种从服务读取 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 的类?

I have a method for reading JSON from a service, I'm using Gson to do my serialization and have written the following method using type parameters.

public T getDeserializedJSON(Class<T> aClass,String url)
{
    Reader r = getJSONDataAsReader(url);
    Gson gson = new Gson();
    return gson.fromJson(r, aClass);
}

I'm consuming json which returns just an array of a type e.g.

[
 { "prop":"value" }
 { "prop":"value" }
]

I have a java class which maps to this object let's call it MyClass. However to use my method I need to do this:

RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);

However, I can't figure out the syntax to do it. Passing just ArrayList.class doesn't work.

So is there a way I can get rid of the Class parameter or how do I get the class of the ArrayList of MyClass?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

爱冒险 2024-09-08 01:08:39

您可以使用 Bozho 的解决方案,或者通过使用避免创建临时数组列表:

Class<List<MyClass>> clazz = (Class) List.class;

此解决方案的唯一问题是您必须使用 @SuppressWarnings("unchecked") 抑制未检查的警告。

You can use Bozho's solution, or avoid the creation of a temporary array list by using:

Class<List<MyClass>> clazz = (Class) List.class;

The only problem with this solution is that you have to suppress the unchecked warning with @SuppressWarnings("unchecked").

人疚 2024-09-08 01:08:39

你不能。你必须使用不安全的强制转换:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();

You can't. You'd have to use unsafe cast:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
⊕婉儿 2024-09-08 01:08:39

作为后续,我在 Gson 文档中找到了这一点。

Type listType = new TypeToken<List<String>>() {}.getType();

这解决了安全获取类型的问题,但 TypeToken 类是 Gson 特有的。

As a follow up to this, I found this in the Gson docs.

Type listType = new TypeToken<List<String>>() {}.getType();

Which solves the problem of getting the type safely but the TypeToken class is specific to Gson.

我做我的改变 2024-09-08 01:08:39

如果您使用的是 SpringFramework,则可以使用 ParameterizedTypeReference
如下:

 restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);

If you are using SpringFramework you could use ParameterizedTypeReference
as follows:

 restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
梦明 2024-09-08 01:08:39

我有一个类似的场景,但我有一个解决方法,使用数组而不是 ArrayList

MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);

这里是什么 反序列化 方法然后

您可以继续处理列表,如下所示:

List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());

I had a similar scenario but I have a workaround to use an array instead of ArrayList

MyClass[] results = restClient.getDeserializedJSON(MyClass[].class, url);

And here what deserialize method does

You can then proceed with list as follows:

List<MyClass> r_results= Arrays.stream(results).collect(Collectors.toList());
浊酒尽余欢 2024-09-08 01:08:39

根据您的要求,但如果您可以使用数组,您可以提供类:MyClass[].class

Depending on how is your requirement, but if you are ok working with array there you can provide as Class: MyClass[].class

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文