首页 > 解决方案 > 从 Kotlin Generic 获取泛型类

问题描述

我有以下类签名:

abstract class BaseActivity<E : ViewModel> : AppCompatActivity() {

    protected lateinit var viewModel: E

}

现在我想使用 ViewModelProvider 以通用方式初始化我的 viewModel,所以:

   viewModel = ViewModelProviders.of(this, viewModelFactory)
            .get(MyViewModel::class)

鉴于 MyViewModel 类将以泛型类型提供,我想说这可能会被抽象到 BaseActivity 中,因此我不必为扩展它的每个 Activity 都这样做。

我试过:

inline fun <reified E : ViewModel> getViewModelClass() = E::class.java

但是当这样做时:

viewModel = ViewModelProviders.of(this, viewModelFactory)
            .get(getViewModelClass())

我明白了Cannot use E as reified type paramter. Use class instead

有针对这个的解决方法吗?

标签: androidkotlin

解决方案


EinBaseActivity不能reified,所以你不能将它传递给任何需要 a 的方法reified E

您最好的选择可能只是接受该类作为构造函数参数。

abstract class BaseActivity<E : ViewModel>(private val modelClass: Class<E>) : AppCompatActivity() {

    protected lateinit var viewModel: E

    ... viewModel = ViewModelProviders.of(this, viewModelFactory)
        .get(modelClass)
}

如果BaseActivity不是抽象的,你可以添加一个工厂方法:

// outside BaseActivity class itself
fun <reified E : BaseModel> BaseActivity() = BaseActivity(E::class.java)

但扩展它时无济于事。


推荐阅读