Java 泛型方法中的泛型参数返回值

Java 泛型方法中的泛型参数返回值,java,generics,parameterization,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 JsonParseExc

我正在为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));
}
public M readMap(字符串路径、类mapType、类keyClass、类valueClass)抛出JsonParseException、JsonMappingException、IOException
{
ObjectMapper mapper=新的ObjectMapper();
返回mapper.readValue(新文件(路径),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);
HashMap-weightMap;
JSONParsedFileHandler reader=新的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>
类型安全性:HashMap类型的表达式需要未经检查的转换才能符合HashMap
我想这意味着返回的类型与预期的一样,只是在编码时没有参数化


有人有什么想法吗?

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

尝试仅绑定到贴图的类,并仅声明来自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));
}

public此解决方案实际上强制方法的调用方进行强制转换(必须显式地从Map转换到HashMap)。我尝试使用泛型返回类型的原因是为了避免它。最佳实践是调用方(实际上所有代码)不应该将变量类型声明为HashMap(实现),而应该声明为Map(抽象类型),因为实现是什么并不重要,重要的是它是一个映射。看见如果您将变量声明为Map,您将拥有更好的代码,并且不需要强制转换。这是真的-但是它不会使警告消失:),但这是一个很好的提示。有没有办法避免丑陋的@SuppressWarning标记?我不相信。不过,这比警告还漂亮,对吧?