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泛型的想法