【发布时间】:2018-05-03 12:28:12
【问题描述】:
我使用 Kotlin 和 Mongo(使用 KMongo)并且我有多个模型,例如 UserEntity、MovieEntity 等等。他们每个人都使用特定的Dao 类来执行(实际上)相同的方法。因此,我试图通过使用应该有这些方法的BaseDao 来避免任何重复。
所以我将通用基础中的特定实体传递为:
class UserDao : BaseDao<UserEntity>() { ... }
这个基类实现的泛型方法如下:
open class BaseDao<T: Any>() {
fun get(id: String): T? {
return getCollection().findOneById(id)
}
fun save(entity: T): T {
return getCollection().save(entity)
}
fun delete(id: String) {
getCollection().deleteOneById(id)
}
...
}
但是,getCollection() 方法出现问题:
private inline fun <reified T: Any> getCollection(): MongoCollection<T> {
return MongoDb.getDatabase().getCollection<T>()
}
每次调用时都会出现编译错误:
Type inference failed: Not enough information to infer parameter T in
inline fun <reified T : Any> getCollection(): MongoCollection<T#1 (type parameter of app.api.db.dao.BaseDao.getCollection)>
Please specify it explicitly.
我找不到执行此操作的正确方法。我已经检查了这些线程,但没有成功:Generic class type usage in Kotlin & Kotlin abstract class with generic param and methods which use type param。
问题:
我怎样才能实现这个通用的BaseDao,它应该得到每个孩子Dao的任何集合?
【问题讨论】:
-
看来你根本不需要
<reified T : Any>。试试<T>。