Java/Kotlin 泛型

标签 java android templates generics kotlin

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

这是我现在的代码

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)时,我会收到类型不匹配 错误。

定义时

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

我还会收到类型不匹配错误

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

最佳答案

完全按照你想要的方式去做将会很棘手,因为我不知道如何告诉编译器你正在做的事情实际上是安全的。添加方差,就像其中一条评论所暗示的那样,不会起作用,因为 Tinout 位置都使用。

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

相关文章:

c++ - 模板类专门针对模板类和其他类型

java - Thymeleaf:如何获取 URL 属性值

java - 图像导出 DayPilot 调度程序

java - JAI 供应商名称 == null

Android,RelativeLayout.BELOW 在 ScrollView 中不起作用

android - 如何从应用程序中删除数据库?

java - Android:实现错误屏幕

c++ - 函数模板语法的默认模板参数

java - 使用 RequestMapping 和 fromUriString 从浏览器进行 http 调用中的任意输入参数

java - 由于重复键,JPA 合并失败