Java / Kotlingenerics
我有一个模板/generics的问题。
这是我目前的代码
data class RealmWatcher( val results: RealmResults, val handler: (RealmResults) -> Unit)
然后在Android片段中使用它来侦听特定的结果并根据更改执行操作。 所以我们以此为例
private val realmListener = arrayOf( RealmWatcher(Realm.getDefaultInstance().where(Notification::class.java).equalTo("isNew", true).findAll(), { n: RealmResults -> // DO STUFF })
我正在做这个片段的开始/停止
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() }
它只适用于我使用一种types(如上面的Notification
)。 我应该如何定义,如果我想使用不同types的forms
private val realmListener = arrayOf( RealmWatcher(Realm.getDefaultInstance().where(Notification::class.java).equalTo("isNew", true).findAll(), { n: RealmResults -> // TODO STUFF }), RealmWatcher(Realm.getDefaultInstance().where(Project::class.java).equalTo("isOdd", true).findAll(), { n: RealmResults -> // TODO STUFF }) )
混合types( Notification
和Project
)时,我会得到Type mismatch
错误。
而当定义的时候
private val realmListener:Array<RealmWatcher>
我也会得到Type mismatch
错误
我怎样才能定义数组有不同types的T几个不同的RealmWatcher?
做你想要的东西会变得棘手,因为我不知道如何告诉编译器你正在做的事实际上是安全的。 正如其中一条评论所暗示的那样,添加方差将不起作用,因为T
在内外都使用。
不过,你可以采取不同的方法。 像这样扩展你的RealmWatcher
:
data class RealmWatcher( val results: RealmResults , val handler: (RealmResults ) -> 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() }
这将做你所需要的,而不会因为混合的generics参数而产生问题。