【问题标题】:Getting class type from generics从泛型获取类类型
【发布时间】:2018-08-02 16:56:48
【问题描述】:

我的函数中有一个泛型类型 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>())
        }
    }
}

这里的问题是ViewModelProviders.of 返回的ViewModelProvider 有这个get 函数,它需要这个Class&lt;T&gt; 类型。

这是我得到的错误:

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

它发生在 getClassType() 函数上。

【问题讨论】:

    标签: android generics kotlin functional-programming factory


    【解决方案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)
        }
    }
    

    【讨论】:

    • 成功了!完美的!以前没有听说过这个具体化。超级有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多