Kotlin序列化HashMap时无法推断类型的问题求助
我遇到了Kotlin序列化的一个问题,希望能得到帮助:
import kotlinx.serialization.json.Json fun main() { val someValue: Double = 1.0 val someKey: String? = null HashMap(readMapFromStorage()).also { it[someKey?: ""] = someValue }.let { Json.encodeToString(it) // Cannot infer type for this parameter. Please specify it explicitly. }.let { runBlocking<Unit> { async { writeString("SomeCategory", it) } } } } private fun readMapFromStorage(): Map<String, Double> { return mapOf( "" to 1.0, "A" to 1.5, "B" to 2.0, ) } private fun writeString(key: String, value: String) { // do something clever }
在第10行调用Json.encodeToString(it)时,我的IDE报错:
Cannot infer type for this parameter. Please specify it explicitly.
这是为什么呢?it明明是HashMap<String, Double>类型(据我所知这个类型应该是可序列化的)。我找到的所有教程都是这么写的,看起来和我的代码没区别,为什么就不行呢?
问题分析与解决办法
嗨,我来帮你捋一捋这个问题~其实核心原因是:Kotlinx Serialization的encodeToString方法需要明确知道要序列化的类型对应的序列化器,但在你的链式调用里,编译器没办法自动推断出这个泛型类型的序列化器。虽然HashMap<String, Double>确实是可序列化的,但链式调用的类型推断在这里“卡壳”了。
给你几个实用的解决办法:
显式指定泛型类型
直接在encodeToString后面加上类型参数,告诉编译器要序列化的具体类型:Json.encodeToString<HashMap<String, Double>>(it)或者更通用的
Map<String, Double>类型也可以,因为HashMap实现了Map接口:Json.encodeToString<Map<String, Double>>(it)在
let块里明确变量类型
在let的参数里给it指定类型,让编译器能清晰识别:HashMap(readMapFromStorage()).also { it[someKey?: ""] = someValue }.let { map: HashMap<String, Double> -> Json.encodeToString(map) }改用
buildMap构建集合
试试用Kotlin标准库的buildMap函数来构建集合,这种方式的类型推断通常更顺畅:buildMap<String, Double> { putAll(readMapFromStorage()) put(someKey ?: "", someValue) }.let { Json.encodeToString(it) }
另外还要确认一下,你已经在项目里正确配置了Kotlinx Serialization的插件和依赖哦,比如在build.gradle文件里添加了对应的插件声明和依赖库,这是序列化功能正常工作的基础!
备注:内容来源于stack exchange,提问作者arkascha

