【发布时间】:2018-07-05 10:13:18
【问题描述】:
我知道 Realm 还没有直接支持泛型。我一直在尝试想出一个解决方法,因为它会极大地减少我的项目中的重复代码。 (我有许多扩展基础 repo 的 repos 和许多仅因 RealmObject 扩展类型而不同的函数)
我有一个相当不错的解决方案:
open class BaseRepository(private val realm: Realm) {
fun <T : RealmModel> get(ofType: Class<T>, id: Long): T? {
return realm.where(ofType).equalTo("id", id).findFirst()
}
}
这可以由我的从 BaseRepository 继承的存储库调用,如下所示:
customRepository.get(CustomType::class.java, id)
我试图通过在构造函数中传递类类型而不是函数参数来进一步改进这一点:
open class BaseRepository<T : RealmModel?>(private val realm: Realm, private val ofType: Class<T>) {
fun <T : RealmModel> get(id: Long): T? {
return realm.where(ofType).equalTo("id", id).findFirst()
}
}
上面有如下编译时错误:
Type mismatch.
Required: T#1 (type parameter of com.acme.data.repository.BaseRepository.get)?
Found: T#2 (type parameter of com.acme.data.repository.BaseRepository)?
我已经进行了各种尝试以使其正常工作,但仍然没有成功。
问题:
为什么我不能在构造函数参数中传递 ofType: Class 而在函数参数中可以?
有人知道怎么解决吗?
是否存在任何问题,无论是 Realm 还是其他,我正在做的事情似乎确实有效并且我的所有测试仍然通过?
有没有人对此有更好的解决方案,例如使用 kotlin 扩展方法?
谢谢, 保罗。
【问题讨论】: