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) } } }
关键改动说明
- 在
getCollection调用时添加<TDataClass>泛型声明,明确文档类型 - 传入构造函数中保存的
clazz参数,避免泛型擦除导致的类型识别问题 - 移除
collection?.的安全调用,因为getCollection只要集合名称合法就会返回非空实例
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

