在< T>泛型列表的java中传递类?

vlf7wbxs  于 2022-11-06  发布在  Java
关注(0)|答案(6)|浏览(215)

我有一个从服务中阅读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" }
]

我有一个Map到这个对象的java类,我们称之为MyClass。但是,要使用我的方法,我需要这样做:

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

但是,我不知道该用什么语法来实现它,只传递ArrayList.class是行不通的。
那么有没有办法去掉Class参数或者我怎么得到MyClass的ArrayList的类呢?

ev7lccsx

ev7lccsx1#

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

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

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

yvfmudvl

yvfmudvl2#

你不能。你必须使用不安全的类型转换:

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

vh0rcniy3#

作为对此的后续行动,我在Gson文档中发现了这个。

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

它解决了安全获取类型的问题,但TypeToken类是特定于Gson的。

mhd8tkvw

mhd8tkvw4#

如果您使用的是SpringFramework,则可以按如下方式使用ParameterizedTypeReference

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

wi3ka0sx5#

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

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

这里是反序列化方法作用
然后,您可以按如下方式继续处理列表:

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

ru9i0ody6#

这取决于您的要求,但如果您可以在此使用阵列,则可以提供Class:MyClass[].class

相关问题