Android kotlin继承是如何工作的?“怎么可能?”*&引用&引用;在;及;“出去”;被利用

Android kotlin继承是如何工作的?“怎么可能?”*&引用&引用;在;及;“出去”;被利用,android,inheritance,kotlin,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&g

我有下面的

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)
    }

}
开放类模型
类工作顺序:模型()
//接口
界面视图界面{
成功(模型:T?,模型:ArrayList?)
}
类WorkOrderSystemImpl(val viewInterface:viewInterface){
有趣的事{
val工作顺序:ArrayList=ArrayList()
//下一行抱怨类型不匹配
viewInterface.notifyDataSuccessful(工作顺序)
}
}

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

这是关于
泛型
不变
协变
,请参见Kotlin文档

简而言之,您只需记住:

消费者进来,生产者出去

根据
列表
的视图确定
消费者
生产者
,这意味着您应该考虑您的
列表
的角色,它是
消费者
还是
生产者
?在您的例子中,
models:ArrayList?
是一个
生产者
,因为它将被
ViewInterface
的实现所使用,所以您应该像这样定义
ViewInterface

interface ViewInterface<T: Model> {
    fun notifyDataSuccessful(model: T?, models: ArrayList<out T>?)
}
界面视图界面{
成功(模型:T?,模型:ArrayList?)
}
检查这里:你要找的是所谓的“协方差”,好吧,加上“out”修正它。。。感谢消费者和生产者的思维方式,在我继续这段旅程的过程中,这将修正我对kotlin泛型的想法