Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 使用具体化类型的常规字符串扩展名转换_Kotlin_Kotlin Reified Type Parameters - Fatal编程技术网

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
    

  • 非常感谢-我将把你所有的建议投入生产。非常感谢-我将把你所有的建议投入生产。