Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/Kotlin泛型_Java_Android_Templates_Generics_Kotlin - Fatal编程技术网

Java/Kotlin泛型

Java/Kotlin泛型,java,android,templates,generics,kotlin,Java,Android,Templates,Generics,Kotlin,我有一个模板/泛型问题 这是我目前掌握的密码 data class RealmWatcher<T>( val results: RealmResults<T>, val handler: (RealmResults<T>) -> Unit) 它仅在我使用一种类型(如上面的Notification)时有效。如果我想以 private val realmListener = arrayOf( Real

我有一个模板/泛型问题

这是我目前掌握的密码

data class RealmWatcher<T>(
        val results: RealmResults<T>,
        val handler: (RealmResults<T>) -> Unit)
它仅在我使用一种类型(如上面的
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
                                       })
                                       )
我还将得到
类型不匹配
错误


我如何定义数组,使其具有多个不同类型的RealmWatcher T?

准确地执行您想要的操作将是一件棘手的事情,因为我不知道如何告诉编译器您所执行的操作实际上是安全的。正如其中一条评论所建议的那样,添加方差将不起作用,因为
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)
    }
}

这将完成您需要它做的事情,而不会因为混合的通用参数而产生问题。

Hm,您可以发布实际错误以及错误发生的位置吗?将差异放在您的领域观察者类上,即,
数据类RealmWatcher
@SimY4,这将不起作用,因为
t
也在代码中的
位置使用。请参阅我的答案,以获得更好地封装逻辑的有效解决方案。
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
                                       })
                                       )
private val realmListener:Array<RealmWatcher<out Any>>
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()
}