我正在为 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>
我认为这意味着返回的类型符合预期,只是它没有按照我的编码进行参数化。
有人有什么想法吗?
最佳答案
constructMapType
方法返回 MapType
,它使用 Class<?>
定义键和内容。通过类型删除,基本上可以翻译为 Object
并且编译器无法判断映射中使用了哪些类型。该类型“按照(您)编码进行参数化”,但 Java 的泛型实现阻止了您提供的类型的任何运行时知识。如果我错了,有人会纠正我,但我相信您唯一的选择是处理警告或抑制它。
关于java - 泛型方法中的泛型参数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200716/