Kotlin使用reified获得泛型类

时间:2018-02-23 20:21:26

标签: android kotlin

我刚刚开始使用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;作为具体的类型参数。改为使用一个类。

有没有让它发挥作用?

2 个答案:

答案 0 :(得分:3)

reified不是类型擦除的神奇解决方法。 JVM上的泛型类的实例不携带有关它实例化的类型参数的任何信息。由于信息不存在,reified无法用于访问它。

reified仅在编译时在调用站点知道类型信息时才有效,这不是这里的情况。

如果您希望能够这样做,则需要将ClassKClass存储为您的类的属性,或者确实创建一个获取{{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。