Android Kotlin泛型问题

Android Kotlin泛型问题,android,generics,kotlin,reactive-programming,Android,Generics,Kotlin,Reactive Programming,将此传递到onResume时出错。 不知怎的,它没有意识到这个实现了活动生命周期类型,我是不是遗漏了什么 打开类BaseActivity:rxappCompativity(),ActivityLifecycleType{ 受保护的var viewModel:ViewModelType?=null @超级呼叫 重写onResume(){ super.onResume() viewModel?.onResume(此)==>无需任何错误,查找BaseActivity } } 开放类活动视图模型{ 恢复

传递到
onResume
时出错。 不知怎的,它没有意识到
这个
实现了
活动生命周期类型
,我是不是遗漏了什么

打开类BaseActivity:rxappCompativity(),ActivityLifecycleType{
受保护的var viewModel:ViewModelType?=null
@超级呼叫
重写onResume(){
super.onResume()
viewModel?.onResume(此)==>无需任何错误,查找BaseActivity
}
}
开放类活动视图模型{
恢复时的乐趣(视图:ViewType){
//做点什么
}
}
接口活动LifecycleType{
乐趣生命周期():可观察
}

Kotlin的泛型“如果您编写的代码更严格,请使用以下代码:

open class BaseActivity<ViewModelType : ActivityViewModel<ActivityLifecycleType>> : ActivityLifecycleType, RxAppCompatActivity() {
    protected var viewModel: ViewModelType? = null

    @CallSuper
    override fun onResume() {
        super.onResume()
        viewModel?.onResume(this@BaseActivity)  // ==> Error Required Nothing, Find BaseActivity<ViewModelType>
    }
}

open class ActivityViewModel<in ViewType : ActivityLifecycleType> {
    fun onResume(view: ViewType) {
        // Do something
    }
}

interface ActivityLifecycleType {
    fun lifecycle(): Observable<ActivityEvent>
}
打开类BaseActivity:ActivityLifecycleType,rxappCompativity(){
受保护的var viewModel:ViewModelType?=null
@超级呼叫
重写onResume(){
super.onResume()
viewModel?.onResume(this@BaseActivity)//=>错误不需要任何内容,查找BaseActivity
}
}
开放类活动视图模型{
恢复时的乐趣(视图:ViewType){
//做点什么
}
}
接口活动LifecycleType{
乐趣生命周期():可观察
}
我所做的是更改第一行中的声明

Java太弱,无法检查泛型类型,但Kotlin可以

提到下一步你必须做两件事:

  • BaseActivity
    中实施
    lifecycle
    ,或将其抽象化
  • 建议使用
    lateinit var viewModel
    而不是可为空的类型

  • BaseActivity
    是否扩展了
    ViewType
    ?编译器说,
    onResume
    不需要任何东西,因为
    RxAppCompatActivity
    有方法
    onResume
    没有参数
    BaseActivity
    覆盖
    RxAppCompatActivity
    onResume
    我编辑了文章,但是在您声明的视图模型上调用了
    BaseActivity
    :的参数类型
    ActivityViewModel
    解析为
    Nothing
    ,因此
    onResume
    需要一种类型的
    Nothing
    。请尝试使用
    this@BaseActivity
    而不是这个。该死!我真蠢,已经修好了,哈哈哈谢谢@nhaarman!“建议使用lateinit var viewModel而不是可为null的类型”。没有。我没说你的问题已经解决了:)@ice1000那句话太宽泛了。在适当的时候使用
    lateinit
    ,这意味着变量保证在距离对象初始化不太远的某个点初始化,并且如果之后未设置为null。用例包括依赖注入和在Android生命周期方法中分配的变量,在这些方法中,您第一次接收到
    上下文。谢谢