首页 > 解决方案 > 在 Reified 之后我们还需要 Class(或 KClass)吗?

问题描述

reified,我可以替换下面的函数

private fun <T>createFragmentX(fragmentClass: Class<T>, fragmentArgs: Bundle?): Fragment {
    try {
        val fragment = fragmentClass.newInstance() as Fragment
        fragment.arguments = fragmentArgs
        return fragment
    } catch (exception: Exception) {
        throw RuntimeException(exception.message)
    }
}

有了这个

private inline fun <reified T>createFragmentZ(fragmentArgs: Bundle?): Fragment {
    try {
        val fragment = T::class.java.newInstance() as Fragment
        fragment.arguments = fragmentArgs
        return fragment
    } catch (exception: Exception) {
        throw RuntimeException(exception.message)
    }
}

在我看来,reified不再需要使用Classor KClass。我对吗?

除了想做纯粹的反射工作之外,还有其他用途ClassKClass不能满足的吗?reified

标签: kotlin

解决方案


简短的回答:

在您的示例中,除了美学之外,它没有任何区别。

长答案:

如果你传入Tas reified,你可以像这样KClassreified类型参数中检索T

val kClass = T::class

随时。然后,您将拥有使用KClassas 参数的所有选项,因此这里没有区别。


在某些情况下,您需要使用KClassas 参数。这里有两个:

1) 没有内联

当您不希望您的函数成为inline时,因为使用reified类型仅适用于内联函数。

2) 默认值

另一种情况是默认值:

fun f(kClass: KClass<*> = Int::class) { /*...*/ }

使用具体的类型参数无法达到完全相同的效果。

结论:

在所有其他情况下,请使用泛型类型参数,因为它使调用站点更简洁,如下所示(这可能是个人喜好):

inline fun <reified T> printType() {
    println(T::class.simpleName)
}

fun printType(kClass: KClass<*>) {
    println(kClass.simpleName)
}

呼叫站点

printType<Int>() // better
printType(Int::class)

推荐阅读