泛型方法中的通用参数返回值

时间:2013-10-05 17:36:37

标签: java generics parameterization

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

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

有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

constructMapType方法返回MapTypeClass<?>使用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));
}