我刚开始使用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
仅在编译时在调用站点上知道类型信息的情况下才有效,在此情况下不是这样。
如果您希望这样做,则需要将Class
或KClass
存储为您的类的属性,或者确实创建一个虚拟方法来获取每个派生类的Class
或KClass
实例。