我正在尝试解决由于使用非类型库而导致的Java原始类型警告。例如。用于解决原始类型警告的番石榴TypeToken
List dataAsList = response.getDataList();
我知道名单是
List<Map<String,Object>>
类型,但我不知道如何无类型“response.getDataList()”转换为类型版本。
我读了Guava TypeToken可以用于类型问题,但我不知道如何使用这个,我的尝试不起作用。
我正在尝试解决由于使用非类型库而导致的Java原始类型警告。例如。用于解决原始类型警告的番石榴TypeToken
List dataAsList = response.getDataList();
我知道名单是
List<Map<String,Object>>
类型,但我不知道如何无类型“response.getDataList()”转换为类型版本。
我读了Guava TypeToken可以用于类型问题,但我不知道如何使用这个,我的尝试不起作用。
如果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
或其他类型。我会试着更多地研究这个。
看起来'String'具有Object,但任何Number都变成了Double,List变成了ArrayList,POJO变成了com.google.gson.internal.StringMap。基本上,你不能依赖Gson转换来复制类型,而无需在'TypeToken'中指定它们。 – 2014-12-22 18:50:30
“但我不知道如何将无类型的”response.getDataList()“转换为打印版本。” - >好吧,只需将其转换为:'(List
这是我不想做的。我不想获得类型警告,我也不想取消警告。 – edu00085 2014-11-01 14:49:02
这里有一些类似的东西,但是对于列表和没有使用TypeToken:http://stackoverflow.com/a/2848268/4089265 – edu00085 2014-11-01 14:49:39