我有一个模板/泛型问题。
这是我现在的代码
data class RealmWatcher<T>(
val results: RealmResults<T>,
val handler: (RealmResults<T>) -> Unit)
并在 Android fragment 中使用它来监听特定结果并根据更改执行操作。我们以此为例
private val realmListener = arrayOf(
RealmWatcher<Notification>(Realm.getDefaultInstance().where(Notification::class.java).equalTo("isNew", true).findAll(),
{ n: RealmResults<Notification> ->
// DO STUFF
})
我在 fragment 开始/停止时执行此操作
override fun onResume() {
super.onResume()
// start listening and execute
realmListener.forEach { it.handler(it.results) }
realmListener.forEach { it.results.addChangeListener(it.handler) }
}
override fun onPause() {
// stop listening
realmListener.forEach { it.results.removeChangeListener(it.handler) }
super.onPause()
}
它仅在我使用一种类型时有效(如上面的Notification
)。如果我想以以下形式使用不同类型,我应该如何定义
private val realmListener = arrayOf(
RealmWatcher<Notification>(Realm.getDefaultInstance().where(Notification::class.java).equalTo("isNew", true).findAll(),
{ n: RealmResults<Notification> ->
// TODO STUFF
}),
RealmWatcher<Project>(Realm.getDefaultInstance().where(Project::class.java).equalTo("isOdd", true).findAll(),
{ n: RealmResults<Project> ->
// TODO STUFF
})
)
混合类型(Notification
和 Project
)时,我会收到类型不匹配
错误。
定义时
private val realmListener:Array<RealmWatcher<out Any>>
我还会收到类型不匹配
错误
如何定义数组以拥有多个具有不同类型 T 的不同 RealmWatcher?
最佳答案
完全按照你想要的方式去做将会很棘手,因为我不知道如何告诉编译器你正在做的事情实际上是安全的。添加方差,就像其中一条评论所暗示的那样,不会起作用,因为 T
在 in
和 out
位置都使用。
但是,您可以采取不同的方法。像这样扩展您的 RealmWatcher
:
data class RealmWatcher<T>(
val results: RealmResults<T>,
val handler: (RealmResults<T>) -> Unit
) {
fun attach() {
handler(results)
results.addChangeListener(handler)
}
fun detach() {
results.removeChangeListener(handler)
}
}
然后在生命周期回调中使用这两个附加函数:
fun onResume() {
super.onResume()
// start listening and execute
realmListener.forEach { it.attach() }
}
fun onPause() {
// stop listening
realmListener.forEach { it.detach() }
super.onPause()
}
这将完成您需要它做的事情,而不会因为混合通用参数而产生问题。
关于Java/Kotlin 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47333234/