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( NotificationProject )时,我会得到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参数而产生问题。