gpt4 book ai didi

Java/Kotlin 泛型

转载 作者:搜寻专家 更新时间:2023-11-01 09:31:03 24 4
gpt4 key购买 nike

我有一个模板/泛型问题。

这是我目前的代码

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
})
)

当混合类型(NotificationProject)时,我会得到一个Type mismatch 错误。

定义

private val realmListener:Array<RealmWatcher<out Any>>

我也会得到类型不匹配错误

如何定义数组以具有多个不同类型 T 的 RealmWatcher?

最佳答案

完全按照您的意愿去做会很棘手,因为我不知道有什么方法可以告诉编译器您正在做的事情实际上是安全的。添加方差,如其中一条评论所建议的那样,不会起作用,因为 T 用于 inout 位置。

但是,您可以采用不同的方法。像这样扩展你的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com