我正在为JSON Jackson pojo序列化/反序列化编写一个包装器。 所以我试着编写一个通用的方法,一般会返回反序列化的对象。
我认为代码会更好地解释这个:
public <K,V, M extends Map<K, V>> M readMap(String path, Class<M> mapType, Class<K> keyClass, Class<V> valueClass) throws JsonParseException, JsonMappingException, IOException
{
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(new File(path), mapper.getTypeFactory().constructMapType(mapType, keyClass, valueClass));
}
代码
HashMap<String, Double> weightMap;
JSONParsedFileHandler reader = new JSONParsedFileHandler();
weightMap = reader.readMap("weights.model", HashMap.class, String.class, Double.class);
这可以按预期工作,但是,我收到了类型安全警告:
Type safety: The expression of type HashMap needs unchecked conversion to conform to HashMap<String,Double>
我认为这意味着返回的类型是预期的,除非它没有像我编码那样参数化。
有没有人有任何想法?
答案 0 :(得分:1)
constructMapType
方法返回MapType
,Class<?>
使用Object
来定义键和内容。类型擦除基本上转换为{{1}},编译器无法告诉地图中使用的类型。类型 “参数化为(您)编码”,但Java的泛型实现可防止您提供的类型的任何运行时知识。如果我错了,有人会纠正我,但我相信你只有选择处理警告或压制警告。
答案 1 :(得分:1)
尝试仅限于地图的类,并仅从K和V声明返回类型:
public <K,V, M extends Map<?, ?>> Map<K, V> readMap(String path, Class<M> mapClass, Class<K> keyClass, Class<V> valueClass) throws JsonParseException, JsonMappingException, IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(new File(path), mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass));
}