Kotlin 在物化之后,我们还需要类(或KClass)吗?
通过将Kotlin 在物化之后,我们还需要类(或KClass)吗?,kotlin,Kotlin,通过将具体化,我可以替换以下函数 private fun <T>createFragmentX(fragmentClass: Class<T>, fragmentArgs: Bundle?): Fragment { try { val fragment = fragmentClass.newInstance() as Fragment fragment.arguments = fragmentArgs return
具体化
,我可以替换以下函数
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 fun createFragmentX(fragmentClass:Class,fragmentArgs:Bundle?):Fragment{
试一试{
val fragment=fragmentClass.newInstance()作为片段
fragment.arguments=fragmentArgs
返回片段
}捕获(异常:异常){
抛出运行时异常(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)
}
}
private-inline-fun-createFragmentZ(fragmentArgs:Bundle?):Fragment{
试一试{
val fragment=T::class.java.newInstance()作为片段
fragment.arguments=fragmentArgs
返回片段
}捕获(异常:异常){
抛出运行时异常(exception.message)
}
}
在我看来,随着具体化
,不再需要使用类
或KClass
。我说得对吗
除了想做纯粹的反射工作外,Class
或KClass
是否还有其他不能通过具体化的实现的用途?简短回答:
在您的示例中,除了美学之外,它没有任何区别
长答覆:
如果将T
作为reified
传入,则可以像这样从reified
类型参数T
中检索KClass
val kClass = T::class
随时都可以。然后,使用KClass
作为参数,就有了所有的选项,所以这里没有区别
但在某些情况下,您需要使用KClass
作为参数。这里有两个:
1)无内联
当您不希望函数是内联的
,因为使用具体化的
类型仅适用于内联函数时
2)默认值
另一种情况是默认值:
fun f(kClass: KClass<*> = Int::class) { /*...*/ }
funf(kClass:kClass=Int::class){/*…*/}
使用具体化的类型参数无法实现完全相同的效果
结论:
在所有其他情况下,使用泛型类型参数,因为它使调用站点更加简洁,如图所示(这可能是个人偏好):
inline fun printType(){
println(T::class.simpleName)
}
趣味打印类型(kClass:kClass){
println(kClass.simpleName)
}
呼叫站点
printType<Int>() // better
printType(Int::class)
printType()//更好
打印类型(Int::class)
简短回答:
在您的示例中,除了美学之外,它没有任何区别
长答覆:
如果将T
作为reified
传入,则可以像这样从reified
类型参数T
中检索KClass
val kClass = T::class
随时都可以。然后,使用KClass
作为参数,就有了所有的选项,所以这里没有区别
但在某些情况下,您需要使用KClass
作为参数。这里有两个:
1)无内联
当您不希望函数是内联的
,因为使用具体化的
类型仅适用于内联函数时
2)默认值
另一种情况是默认值:
fun f(kClass: KClass<*> = Int::class) { /*...*/ }
funf(kClass:kClass=Int::class){/*…*/}
使用具体化的类型参数无法实现完全相同的效果
结论:
在所有其他情况下,使用泛型类型参数,因为它使调用站点更加简洁,如图所示(这可能是个人偏好):
inline fun printType(){
println(T::class.simpleName)
}
趣味打印类型(kClass:kClass){
println(kClass.simpleName)
}
呼叫站点
printType<Int>() // better
printType(Int::class)
printType()//更好
打印类型(Int::class)
您不需要在此处将其作为参数传递,但您的代码仍然使用Class
:这就是t::Class.java
的含义。是的,在很多情况下,您需要Class
,而您的就是其中之一。您不需要在这里将其作为参数传递,但您的代码仍然使用Class
:这就是t::Class.java
的含义。因此,是的,在很多情况下,您需要类,而您的类就是其中之一。为什么不私有内联乐趣
?为什么不私有内联乐趣
?3)当它是类参数时(尽管您可以使用具体化的创建帮助函数)。3)当它是类参数时(尽管您可以使用具体化的创建助手函数)。