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

时间:2010-05-09 14:23:56

标签: 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);
}

我正在使用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类?

6 个答案:

答案 0 :(得分:23)

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

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

此解决方案的唯一问题是您必须使用@SuppressWarnings(“未选中”)来取消未经检查的警告。

答案 1 :(得分:6)

作为后续跟进,我在Gson文档中找到了这个。

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

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

答案 2 :(得分:5)

你做不到。你必须使用不安全的演员:

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

答案 3 :(得分:0)

如果您使用的是$result = []; $array1 = [ [ "id" => 1, "other_data" => "text1" ], [ "id" => 2, "other_data" => "text2" ], [ "id" => 3, "other_data" => "text3" ], ]; $array2 = [ [ "id" => 1, "other_data" => "text1" ], [ "id" => 8, "other_data" => "text8" ], ]; $merge_array = function($array, $result) { foreach($array as $element) { $id = $element["id"]; //In your case it could be $element->getId() if(!isset($result[$id])) { $result[$id] = $element; } } return $result; }; $result = $merge_array($array1, $result); $result = $merge_array($array2, $result); print_r(array_values($result)); ,则可以使用SpringFramework 如下:

ParameterizedTypeReference

答案 4 :(得分:0)

我遇到了类似的情况,但我有一个解决方法来使用数组而不是 ArrayList

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

这里 deserialize 方法的作用

然后您可以按如下方式继续列表:

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

答案 5 :(得分:0)

取决于您的要求,但如果您可以在那里使用数组,则可以提供 Class:MyClass[].class