我刚开始使用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()收到一个错误:



反正有使其工作吗?

最佳答案

reified对于类型擦除不是一个神奇的解决方法。 JVM上的泛型类的实例不包含有关实例化其类型参数的任何信息。由于该信息不存在,因此无法使用reified来访问它。
reified仅在编译时在调用站点上知道类型信息的情况下才有效,在此情况下不是这样。

如果您希望这样做,则需要将ClassKClass存储为您的类的属性,或者确实创建一个虚拟方法来获取每个派生类的ClassKClass实例。

10-08 17:03