Kotlin 使用具体化类型的常规字符串扩展名转换
我在尝试实现一般字符串到数字字符串扩展方法时开始使用具体化关键字。以下代码已编译并运行,但我想在将其用于生产代码之前对其进行改进:Kotlin 使用具体化类型的常规字符串扩展名转换,kotlin,kotlin-reified-type-parameters,Kotlin,Kotlin Reified Type Parameters,我在尝试实现一般字符串到数字字符串扩展方法时开始使用具体化关键字。以下代码已编译并运行,但我想在将其用于生产代码之前对其进行改进: inline fun <reified T> String.convertTo():T { return when(T::class.simpleName){ Int::class.simpleName->{(this.toIntOrNull() ?: 0) as T} Float::class.simple
inline fun <reified T> String.convertTo():T {
return when(T::class.simpleName){
Int::class.simpleName->{(this.toIntOrNull() ?: 0) as T}
Float::class.simpleName->{(this.toFloatOrNull() ?: 0f) as T}
Double::class.simpleName->{(this.toDoubleOrNull() ?: 0.0) as T}
else -> throw IllegalArgumentException("Can't convert type $(T::class.simpleName)")
}
}
inline fun String.convertTo():T{
当(T::class.simpleName)时返回{
Int::class.simpleName->{(this.toIntOrNull()?:0)作为T}
Float::class.simpleName->{(this.toFloatOrNull()?:0f)作为T}
Double::class.simpleName->{(this.toDoubleOrNull()?:0.0)作为T}
else->抛出IllegalArgumentException(“无法转换类型$(t::class.simpleName)”)
}
}
我喜欢这方面的consise调用者代码:
val time:Int by lazy {((evaluateExpression("time").convertTo<Float>().times(1000f))).toInt()}
val-time:Int by lazy{((evaluateExpression(“time”).convertTo().times(1000f)).toInt()}
如果在这种情况下可能,我想做两件事:
1) 我还无法找到正确的语法来将具体化的t约束为只允许的类型——我想用尽when条件并删除else->throw
2) T::class.java无法与其他类型的类类型(即Int::class.java)进行正确比较,因此我求助于比较simpleName字符串-有什么更好的方法
这里有没有限制类型的方法和比较类类型的更好方法
T
。当然,您不能将超类型添加到内置的Int
、Float
等类中,但这些都是Number
类,您可以使用:
inline fun <reified T : Number> String.convertTo(): T
T
。当然,您不能将超类型添加到内置的Int
、Float
等类中,但这些都是Number
类,您可以使用:
inline fun <reified T : Number> String.convertTo(): T
非常感谢-我将把你所有的建议投入生产。非常感谢-我将把你所有的建议投入生产。