用于解决原始类型警告的Guava TypeToken

时间:2014-11-01 12:10:48

标签: java types guava

我正在尝试解决Java原型警告,因为使用了非类型库。例如。

List dataAsList = response.getDataList();

我知道列表的类型为

List<Map<String,Object>> 

但我不知道如何将无类型的“response.getDataList()”转换为类型化版本。

我读过Guava TypeToken可以用于类型问题,但我不知道如何使用它,我的尝试不起作用。

1 个答案:

答案 0 :(得分:0)

如果List的通用参数是原始类型,即它本身没有泛型参数,请查看使用Guava解决方案的my answer to a different question

否则,您可以使用Gson进行序列化/反序列化。与其他解决方案相比,这可能相对较慢,但实施起来最干净。假设每次请求你没有多次这样做,它应该比进行任何I / O调用(例如数据库请求)更糟糕。下面的示例实际上是对Gson API中的示例用法的优化修改。

此示例适用于大多数不需要专门序列化的简单类。

private final static Gson GSON = new Gson();

public static <T> T cast(Object object, TypeToken<T> token){
     String json = GSON.toJson(object);
     T result = GSON.fromJson(json, token.getType());
     return result;
}

用法:

List<Map<String,String>> dataAsList = cast(
   response.getDataList(), new TypeToken<List<Map<String,String>>>(){});

声明:

在您描述的确切情况下,此解决方案将无效,因为Maps值类型为Object,Gson不知道您要转换为哪种类型。我不确定它是否会抛出异常,或者它是否会将其保留为JsonObject或其他类型。我会尝试更多地研究它。