首页 > 解决方案 > Kotlin:使用不同的子类多次实现泛型接口(基类是约束)

问题描述

错误消息:“SchedulableInserter”的类型参数 E 的值不一致:事件、分配

所以基本上我有一个抽象类Schedulable。另外我有两个类事件(单一发生的事件,如时间戳)和一个类分配(基本上是一个事件,但也有持续时间)我有一个 MainActivity,我想将实例插入 SQLiteDB。我想为 Schedulable 的每个子类使用不同的插入方法,以轻松处理它们之间的差异。

//SchedulableInserter.kt

interface SchedulableInserter<E> where E : Schedulable{
        fun onInsertSchedulable(item:E)
}

//MainActivity.kt

class MainActivity() : AppCompatActivity(),
    NavigationView.OnNavigationItemSelectedListener,
    SchedulableInserter<Incident>, SchedulableInserter<Assignment> {
 /* ^                                ^
    |                                |
   Sadly Kotlin says:
   Type parameter E of 'SchedulableInserter' has inconsistent values: 
   Incident, Assignment
   A Supertype apperars twice
*/
}

我的意思是,如果我将 SchedulerInserter 绑定到 Schedulable,我可以在方法中进行区分,但我希望不必这样做。

标签: androidgenericskotlinconstraints

解决方案


我建议将插入器作为活动中的属性而不是实现的接口:

class MainActivity() : AppCompatActivity(),
    NavigationView.OnNavigationItemSelectedListener {
    val incidentInserter = SchedulableInserter<Incident> { ... }
    val assignmentInserter = SchedulableInserter<Assignment> { ... }
}

要使该语法可用,您目前需要SchedulableInserter在 Java 中而不是 Kotlin 中定义;否则你必须写

    val incidentInserter = object : SchedulableInserter<Incident> { 
        override fun ...
    }

推荐阅读