Kotlin继承如何工作?以及如何使用“ *”,“ in”和“ out”

时间:2018-06-21 08:54:02

标签: android inheritance kotlin

我有以下

open class Model

class WorkOrder : Model()

//An interface

interface ViewInterface<T : Model> {
    fun notifyDataSuccessful(model: T?, models:ArrayList<T>?)
}

class WorkOrderSystemImpl(val viewInterface: ViewInterface<Model>) {

    fun doSomething() {
        val workOrders: ArrayList<WorkOrder> = ArrayList()
        //the below line complains of type mismatch
        viewInterface.notifyDataSuccessful(workOrders)
    }

}

它抱怨类型不匹配,这对我来说很奇怪,因为WorkOrder是Model的子类型,我希望它能解析为相同类型。

1 个答案:

答案 0 :(得分:1)

关于Generics的{​​{1}}和invariant,请参阅Kotlin文档here

简而言之,您只需记住:

  

消费者进入,生产者退出!

covariantConsumer是从Producer的角度确定的,这意味着您应该考虑自己List的角色,是{{ 1}}还是List?在您的情况下,ConsumerProducer,因为它将由models:ArrayList<T>?的实现使用,因此您应像这样定义Producer

ViewInterface