【发布时间】:2018-06-19 12:23:59
【问题描述】:
在尝试实现通用字符串到数字字符串扩展方法时,我开始使用 reified 关键字。以下编译并运行,但我想在生产代码中使用它之前对其进行改进:
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)")
}
}
我喜欢这个简洁的调用者代码:
val time:Int by lazy {((evaluateExpression("time").convertTo<Float>().times(1000f))).toInt()}
如果在这种情况下可能,我想做两件事:
1) 我无法找到正确的语法来将 reified T 限制为仅允许的类型 - 我想用尽 when 条件并删除 else->throw
2) T::class.java 不能正确地与其他类型的类类型(即 Int::class.java)进行比较,所以我求助于比较 simpleName 字符串 - 什么会更好?
这里有没有限制类型的方法和比较类类型的更好方法?
【问题讨论】:
标签: kotlin kotlin-reified-type-parameters