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