- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简单地说,我想要一个像这样的函数:
fun <T> convert(val foo: String, fooT: KType) : T {
...?
}
对于Int
,它将返回foo.toInt()
,对于Double
,返回foo.toDouble()
,对于某些未知类型,只抛出异常。我认为为我期望的类型创建我自己的 switch 语句并不难,但出于好奇 - 已经有办法了吗?
最佳答案
不幸的是,没有简单的通用方法,因为我们不是在处理强制转换,而是在处理方法调用。这将是我的方法:
fun <T> convert(str: String, type: KType) : T {
val result: Any = when (type.jvmErasure)
{
Long::class -> str.toLong()
Int::class -> str.toInt()
Short::class -> str.toShort()
Byte::class -> str.toByte()
...
else -> throw IllegalArgumentException("'$str' cannot be converted to $type")
}
return result as T // unchecked cast, but we know better than compiler
}
用法:
@UseExperimental(ExperimentalStdlibApi::class)
fun main() {
val int = convert<Int>("32", typeOf<Int>())
println("converted: $int")
}
而不是 KType
参数,你也可以使用 Class<T>
并使函数具体化,所以它可以被称为convert<Int>("32")
甚至 "32".toGeneric<Int>()
.
虽然没有简单的方法,但可以使用大量反射并依赖于实现细节来访问类型。为此,我们可以从 KType
中提取类型名称。对象,找到匹配的扩展方法(在不同的类中),并使用反射调用它。
我们必须使用 to*OrNull()
而不是 to*()
,因为后者是内联的,不会被反射找到。此外,我们需要求助于 Java 反射——此时,Kotlin 反射抛出 UnsupportedOperationException
。对于所涉及的类型。
我不建议在生产代码中这样做,因为它效率低下并且可能会破坏 future 的标准库版本,但这是一个不错的实验:
fun convert(str: String, type: KType): Any {
val conversionClass = Class.forName("kotlin.text.StringsKt")
// here, the to*OrNull() methods are stored
// we effectively look for static method StringsKt.to*OrNull(String)
val typeName = type.jvmErasure.simpleName
val funcName = "to${typeName}OrNull" // those are not inline
val func = try {
conversionClass.getMethod(funcName, String::class.java) // Java lookup
} catch (e: NoSuchMethodException) {
throw IllegalArgumentException("Type $type is not a valid string conversion target")
}
func.isAccessible = true // make sure we can call it
return func.invoke(null, str) // call it (null -> static method)
?: throw IllegalArgumentException("'$str' cannot be parsed to type $type")
}
关于kotlin - 有没有办法从 'String' 转换为 'KType' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58744044/
我有一种情况,我想调用一个函数来生成一个我只有 KType 描述的类型的对象。 基本上我有: inline fun coolFunction(from : String) : T = // Okay,
我有两个可能看起来像这样的类(class) class MyClass { var myProperty: AnotherClass? } class AnotherClass { } 通过反
我有一个简单的 TYPE_USE 注释: @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE_USE, ElementType.
我正在尝试 Kotlin 中的反射功能,但我似乎无法理解如何获取 KType 值。 假设我有一个将短语映射到对象工厂的类。如果有歧义,用户可以提供 type将搜索范围缩小到仅返回该类型对象(或某些子类
简单地说,我想要一个像这样的函数: fun convert(val foo: String, fooT: KType) : T { ...? } 对于Int,它将返回foo.toInt(),
我想检查函数是否有 A 类型的参数,请使用以下代码: import kotlin.reflect.* import javafx.event.ActionEvent interface IA {} c
我是一名优秀的程序员,十分优秀!