Kotlin:使用不同的子类多次实现通用接口(基类是约束)

时间:2019-02-07 20:10:28

标签: android generics kotlin constraints

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

所以基本上我有一个抽象类Schedulable。 我也有两个类的事件(单个事件,如时间戳) 和一个类Assignment(基本上是一个事件,但也有一个持续时间) 我有一个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,我可以在方法中进行区分,但是我希望不必这样做。

2 个答案:

答案 0 :(得分:1)

我建议在活动中使用插入器作为属性,而不是已实现的接口:

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

要使that syntax可用,currently需要使用Java而不是Kotlin定义SchedulableInserter;否则你必须写

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

答案 1 :(得分:0)

本·本回答。

解决方案:

  

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