2014-11-01 51 views
0

我正在尝试解决由于使用非类型库而导致的Java原始类型警告。例如。用于解决原始类型警告的番石榴TypeToken

List dataAsList = response.getDataList(); 

我知道名单是

List<Map<String,Object>> 

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

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

+0

“但我不知道如何将无类型的”response.getDataList()“转换为打印版本。” - >好吧,只需将其转换为:'(List >)response.getDataList()'。你仍然会从编译器得到一个类型警告,但是你可以'@SuppressWarnings(“unchecked”)'语句 – fge 2014-11-01 12:16:53

+0

这是我不想做的。我不想获得类型警告,我也不想取消警告。 – edu00085 2014-11-01 14:49:02

+0

这里有一些类似的东西,但是对于列表和没有使用TypeToken:http://stackoverflow.com/a/2848268/4089265 – edu00085 2014-11-01 14:49:39

回答

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>>>(){}); 

免责声明:

在你描述这个解决方案将无法工作,因为地图值类型是Object和GSON不知道哪个输入您要的确切情况转换成。我不确定它是否会抛出异常,或者它是否会将其保留为JsonObject或其他类型。我会试着更多地研究这个。

+0

看起来'String'具有Object,但任何Number都变成了Double,List变成了ArrayList,POJO变成了com.google.gson.internal.StringMap。基本上,你不能依赖Gson转换来复制类型,而无需在'TypeToken'中指定它们。 – 2014-12-22 18:50:30