在通用列表的java中传递Class <T>?

Rob*_*ett 12 java generics

我有一个从服务中读取JSON的方法,我正在使用Gson进行序列化,并使用类型参数编写了以下方法.

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

我正在使用json,它只返回一个类型的数组,例如

[
 { "prop":"value" }
 { "prop":"value" }
]
Run Code Online (Sandbox Code Playgroud)

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

RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚它的语法.仅传递ArrayList.class不起作用.

那么有没有办法可以摆脱Class参数或者如何获取MyClass的ArrayList类?

Eya*_*der 26

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

Class<List<MyClass>> clazz = (Class) List.class;
Run Code Online (Sandbox Code Playgroud)

此解决方案的唯一问题是您必须使用@SuppressWarnings("未选中")禁止未经检查的警告.


Boz*_*zho 8

你不能.你必须使用不安全的演员表:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
Run Code Online (Sandbox Code Playgroud)


Rob*_*ett 7

作为后续行动,我在Gson文档中发现了这一点.

Type listType = new TypeToken<List<String>>() {}.getType();
Run Code Online (Sandbox Code Playgroud)

这解决了安全获取类型的问题,但TypeToken类特定于Gson.