Android 从泛型获取类类型

Android 从泛型获取类类型,android,generics,kotlin,functional-programming,factory,Android,Generics,Kotlin,Functional Programming,Factory,我的函数中有一个泛型类型T,我需要获取类类型以便将它发送到另一个函数。我读过几篇文章,说在Java/Kotlin中很难做到这一点,并尝试了几种解决方案,但都没有成功 这是我的代码: class FishbrainViewModelProviders { companion object { private fun <T : ViewModel?> getClassType(): Class<T> { return (ja

我的函数中有一个泛型类型T,我需要获取类类型以便将它发送到另一个函数。我读过几篇文章,说在Java/Kotlin中很难做到这一点,并尝试了几种解决方案,但都没有成功

这是我的代码:

class FishbrainViewModelProviders {

    companion object {

        private fun <T : ViewModel?> getClassType(): Class<T> {
            return (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] as Class<T>
        }

        fun <T : ViewModel?> getViewModel(fragment: Fragment, creator: () -> T): T {
            return ViewModelProviders.of(fragment, BaseViewModelFactory(creator)).get(getClassType<T>())
        }
    }
}
类FishbrainViewModelProviders{
伴星{
private fun getClassType():类{
返回(javaClass.genericSuperclass作为ParameterizedType)。actualTypeArguments[0]作为类
}
有趣的getViewModel(片段:片段,创建者:()->T):T{
返回ViewModelProviders.of(片段,BaseViewModelFactory(创建者)).get(getClassType())
}
}
}
这里的问题是,
ViewModelProviders.of
返回的
ViewModelProvider
具有此
get
函数,该函数需要此
类型

这就是我得到的错误:

java.lang.ClassCastException:java.lang.Class不能强制转换为java.lang.reflect.ParameterizedType

它发生在
getClassType()
函数上。

您尝试过使用类型参数吗?请注意,它将要求您的方法成为内联:

companion object {
    inline fun <reified T : ViewModel?> getViewModel(fragment: Fragment, creator: () -> T): T {
        return ViewModelProviders.of(fragment, BaseViewModelFactory(creator)).get(T::class.java)
    }
}
伴生对象{
内联有趣的getViewModel(片段:片段,创建者:()->T):T{
返回ViewModelProviders.of(片段,BaseViewModelFactory(创建者)).get(T::class.java)
}
}

真管用!完美的我以前没听说过这件事。非常有趣。