我刚刚开始使用Kotlin而不是Java,并且我正在努力使得重新工作来检索泛型类。这是我的用例
abstract class BaseDataFragment<VM : BaseViewModel> : BaseFragment()
{
@Inject
protected lateinit var viewModelProvider: ViewModelProvider
protected lateinit var viewModel: VM
@CallSuper
override fun init(savedInstanceState: Bundle?)
{
viewModel = viewModelProvider.get(getViewModelClass())
}
private inline fun <reified T : ViewModel> getViewModelClass():Class<T> = T::class.java
}
很遗憾,我从getViewModelClass()
收到错误:
无法使用&#39; VM&#39;作为具体的类型参数。改为使用一个类。
有没有让它发挥作用?
答案 0 :(得分:3)
reified
不是类型擦除的神奇解决方法。 JVM上的泛型类的实例不携带有关它实例化的类型参数的任何信息。由于信息不存在,reified
无法用于访问它。
reified
仅在编译时在调用站点知道类型信息时才有效,这不是这里的情况。
如果您希望能够这样做,则需要将Class
或KClass
存储为您的类的属性,或者确实创建一个获取{{1}的虚拟方法每个派生类的实例或Class
实例。
答案 1 :(得分:0)
我还努力在Kotlin中检索泛型的Java类,但最终失败了。我找到了另一种满足此要求的方法。
abstract class BaseDataFragment: BaseFragment() {
protected lateinit var viewModel: BaseViewModel
fun initFragment() {
viewModel = initVM()
}
open fun initVM(): BaseViewModel {
return viewModelProviders.of(this).get(MyViewModel::java.class)
}
}
继承的类可以重写此函数以实现所有者ViewModel。