Kotlin中使用Jackson readValue与HashMap的类型不匹配问题
解决Jackson ObjectMapper Kotlin类型不匹配问题
原Java代码:
public static HashMap<String, Serializable> jsonDecode(String body) { try { return new ObjectMapper().readValue(body, HashMap.class); } catch (IOException e) { return null; } }
IntelliJ自动转换后的Kotlin代码:
fun jsonDecode(body: String?): java.util.HashMap<String, Serializable>? { return try { ObjectMapper().readValue(body, HashMap::class.java) } catch (e: IOException) { null } }
编译器抛出错误:
Type mismatch: inferred type is HashMap<*, *>! but HashMap<String, Serializable>? was expected
问题原因
Java泛型存在类型擦除机制,原Java代码中直接传入HashMap.class时,泛型信息会丢失,编译器仅会给出未检查转换的警告而非错误。但Kotlin的类型检查更严格,Jackson无法从HashMap::class.java推断出具体的键值类型,因此返回的是HashMap<*, *>,与声明的返回类型不匹配。
解决方案
使用Jackson的TypeReference明确指定泛型类型,让ObjectMapper清楚要反序列化的具体HashMap类型:
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import java.io.IOException import java.io.Serializable import java.util.HashMap fun jsonDecode(body: String?): HashMap<String, Serializable>? { return try { ObjectMapper().readValue(body, object : TypeReference<HashMap<String, Serializable>>() {}) } catch (e: IOException) { null } }
可选优化
如果希望使用Kotlin原生集合类型,可将返回类型改为MutableMap<String, Serializable>?,代码调整如下:
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import java.io.IOException import java.io.Serializable fun jsonDecode(body: String?): MutableMap<String, Serializable>? { return try { ObjectMapper().readValue(body, object : TypeReference<MutableMap<String, Serializable>>() {}) } catch (e: IOException) { null } }
内容的提问来源于stack exchange,提问作者José-Alberto Gilberte León
相关产品推荐
相关产品推荐

