从泛型获取类类型

时间:2018-08-02 16:56:49

标签: android generics kotlin functional-programming factory

我的函数内部有一个通用类型T,我需要获取Class类型才能将其发送给另一个函数。我读过几篇文章,说在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>())
        }
    }
}

这里的问题是由ViewModelProvider返回的ViewModelProviders.of具有此get函数,它期望这种Class<T>类型。

这是我得到的错误:

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

它正在getClassType()函数上发生。

1 个答案:

答案 0 :(得分:1)

您是否尝试过使用reified类型参数?请注意,这将需要您的方法内联:

companion object {
    inline fun <reified T : ViewModel?> getViewModel(fragment: Fragment, creator: () -> T): T {
        return ViewModelProviders.of(fragment, BaseViewModelFactory(creator)).get(T::class.java)
    }
}