kotlin - 在 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
不再需要使用Class
or KClass
。我对吗?
除了想做纯粹的反射工作之外,还有其他用途Class
或KClass
不能满足的吗?reified
解决方案
简短的回答:
在您的示例中,除了美学之外,它没有任何区别。
长答案:
如果你传入T
as reified
,你可以像这样KClass
从reified
类型参数中检索T
val kClass = T::class
随时。然后,您将拥有使用KClass
as 参数的所有选项,因此这里没有区别。
在某些情况下,您需要使用KClass
as 参数。这里有两个:
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)
推荐阅读
- html - 如何从 fontawesome 5 svg 开始评分?
- android - 隐藏Toast后是否可以完成测试?
- angular - 如何在组件之间共享来自 http 响应的数据?
- sql - Query to find rows with nearest date in future
- html - parttails html文件更改未显示在angularjs应用程序中
- d3.js - 使用 fitSize 函数无法正确显示特征
- javascript - 单击链接属性时强制在加载前重新加载页面
- hibernate - 如何在hibernate和jpa中加入uuid列?
- function - 如何基于数组检查 + if 语句返回值?
- python-3.x - Spyder:不同的结果取决于我使用 F5 还是 F9 运行代码