0

我正在为 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>

我认为这意味着返回的类型与预期的一样,只是它没有像我编码的那样被参数化。

有人有想法吗?

4

2 回答 2

1

constructMapType方法返回MapType,用于Class<?>定义键和内容。使用基本上转换为Object的类型擦除,编译器无法判断映射中使用了哪些类型。该类型“参数化为(您)编码的”,但 Java 的泛型实现阻止了您提供的类型的任何运行时知识。如果我错了,有人纠正我,但我相信你唯一的选择是处理警告或压制它。

于 2013-10-05T17:48:27.957 回答
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));
}
于 2013-10-05T17:58:32.387 回答