使用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,就不再需要使用ClassKClass。我对吗?

除了想要进行纯反射工作之外,还有Class无法实现的KClassreified的其他用途吗?

最佳答案

简短答案:

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

长答案:

如果将T作为reified传递,则可以像这样从KClass类型参数reified检索T

val kClass = T::class

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

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

1)无内联

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

2)默认值

另一种情况是默认值:
fun f(kClass: KClass<*> = Int::class) { /*...*/ }

使用修饰的类型参数无法实现完全相同的效果。

结论:

在所有其他情况下,请使用泛型类型参数,因为它使 call 站点更加简洁,如下所示(可能是个人喜好):
inline fun <reified T> printType() {
    println(T::class.simpleName)
}

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

call 现场
printType<Int>() // better
printType(Int::class)

关于kotlin - 修改后是否还需要Class(或KClass)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54388984/

10-10 19:51