android - 从 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
有针对这个的解决方法吗?
解决方案
E
inBaseActivity
不能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)
但扩展它时无济于事。
推荐阅读
- node.js - 为什么我无法使用 localhost 将我的 nodejs 应用程序连接到 postgres
- amazon-web-services - aws eb deploy 不加载环境变量
- python - python-docx 库 - 如何扩展“文档”类
- angular - 如何获取数组角度中对象的ID
- c# - 子对象的统一移动
- angular - 服务中的角度路由参数
- javascript - 使用 Browserify 和 Gulp 替换生产和开发 ENV 之间的字符串路径
- java - 在eclipse中导入maven项目时缺少pom.xml文件
- windows - 有没有办法通过命令行(用于 Github Actions)在 Windows 上安装 Apple Bonjour SDK?
- python - 字典到列表,其中键重复值的次数