使用Moshi转换对象时出现「Not enough information to infer type variable T」错误的排查求助
问题核心原因
你遇到的错误完全是因为创建MutableMap的参数化类型时传错了参数数量!Map(包括MutableMap)是键值对结构,Types.newParameterizedType只需要两个类型参数:键的Class和值的Class,但你传入了一堆类(LayerTwoConn、TWeFiState...),这完全不符合Map的泛型定义,Moshi自然无法推断正确的类型变量。
对比你的正常场景:MutableList只需要一个元素类型参数,所以你传CnrScan::class.java是正确的,代码能正常运行。
修复步骤
首先你要明确:你要序列化的layerTwoConn对应的MutableMap的键类型和值类型到底是什么?比如如果你的Map是MutableMap<String, LayerTwoConn>,那参数化类型应该这么创建:
// 假设键是String,值是LayerTwoConn,请根据你的实际业务调整键/值类型 val type: Type = Types.newParameterizedType( MutableMap::class.java, String::class.java, // 键的类型 LayerTwoConn::class.java // 值的类型 ) val json = Moshi.Builder().build().adapter(type).toJson(layerTwoConn)
如果你其实是想直接序列化LayerTwoConn对象本身(而不是把它作为Map的值),那根本不需要创建Map的参数化类型,直接用类本身的类型即可:
val json = Moshi.Builder().build().adapter(LayerTwoConn::class.java).toJson(layerTwoConn)
关于LayerTwoConn私有构造方法的说明
当前你执行的是**序列化(toJson)操作,私有构造方法不会影响这个过程——因为序列化只需要读取对象的属性值,不需要创建新实例。但如果后续你需要反序列化(fromJson)**这个类的对象,Moshi就会因为无法调用私有构造方法而报错,这时候你需要给LayerTwoConn添加@JsonClass(generateAdapter = true)注解,让Moshi生成适配的序列化器,或者手动编写JsonAdapter来处理私有构造的情况。
内容的提问来源于stack exchange,提问作者theblitz

