使用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
,就不再需要使用Class
或KClass
。我对吗?除了想要进行纯反射工作之外,还有
Class
无法实现的KClass
或reified
的其他用途吗? 最佳答案
简短答案:
在您的示例中,除了美学外,它没有任何区别。
长答案:
如果将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/