You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin泛型MongoRepository写入MongoDB时TDocument类型推断失败

解决KMongo泛型集合获取的类型推断错误

错误信息翻译

无法推断类型变量TDocument的足够信息

问题原因

KMongo的getCollection方法需要明确知晓要操作的文档类型,你当前仅传入集合名称,编译器无法自动将泛型TDataClass关联到方法的TDocument类型参数,因此抛出类型推断错误。

修复方案

调用getCollection时显式指定泛型参数,同时利用构造函数中传入的Class<TDataClass>实例辅助类型绑定,确保编译器能正确识别文档类型。

修改后的完整代码

class MongoRepository<TDataClass : Serializable>(
    connectionString: String,
    dbName: String,
    private val clazz: Class<TDataClass>
) {
    private val client: CoroutineClient
    private var database: CoroutineDatabase

    init {
        client = KMongo.createClient(
            MongoClientSettings.builder()
                .applyConnectionString(ConnectionString(connectionString))
                .applyToConnectionPoolSettings {
                    it.maxConnectionIdleTime(60000, TimeUnit.MILLISECONDS)
                        .minSize(5).maxSize(40)
                }
                .build()
        ).coroutine
        database = client.getDatabase(dbName)
    }

    public fun setDatabase(name: String) {
        database = client.getDatabase(name)
    }

    fun write(collectionName: String, data: TDataClass) {
        // 显式指定泛型并传入Class实例,解决类型推断问题
        val collection = database.getCollection<TDataClass>(collectionName, clazz)
        runBlocking {
            collection.insertOne(data)
        }
    }
}

关键改动说明

  1. 在getCollection调用时添加<TDataClass>泛型声明,明确文档类型
  2. 传入构造函数中保存的clazz参数,避免泛型擦除导致的类型识别问题
  3. 移除collection?.的安全调用,因为getCollection只要集合名称合法就会返回非空实例

内容的提问来源于stack exchange,提问作者Satyam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:42:27