有没有一种方法可以将“字符串”转换为“ KType”?

罗莉

简单来说,我想要一个像这样的函数:

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参数以外,您还可以使用aClass<T>并使函数功能化,因此可以将其称为asconvert<Int>("32")或even "32".toGeneric<Int>()


铁杆方式

虽然没有简单的方式,可以访问使用重型反射和依靠实现细节的类型。为此,我们可以从KType对象中提取类型名称,找到匹配的扩展方法(在其他类中),然后使用反射对其进行调用。

我们必须使用to*OrNull()代替to*(),因为后者是内联的,不会通过反射找到。另外,我们需要求助于Java反射-此时,Kotlin反射会抛出UnsupportedOperationException所涉及的类型。

我不建议在生产性代码中使用此方法,因为它效率低下并且可能会与将来的标准库版本一起使用,但这是一个不错的实验:

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")
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种方法可以将graphql查询字符串转换为GraphQLResolveInfo对象?

Kotlin将KType传递为通用参数

有没有一种方法可以将代表多个标志成员的字符串转换为复合enum.Flag?

有没有一种方法可以使用Go将JSON字符串转换为Mongo扩展JSON?

有没有一种方法可以将字符串转换为D中的二进制

有没有一种方法可以将Serde Map转换为Value?

有没有一种方法可以将OwinRequest转换为HttpRequestBase?

有没有一种方法可以自动将Groovy转换为Java?

有没有一种方法可以将JSON模式转换为XSD?

有没有一种方法可以将QTableView模型转换为QStandardItemModel

有没有一种方法可以从字符串创建结构实例?

从KType创建类实例的正确方法是什么

有没有一种方法可以消除口音并将整个字符串转换为常规字母?

有没有一种方法可以将以字符串表示的数字转换为等效的二进制数?

有没有一种方法可以通过在Python中将其转换为字符串来检索网页的HTML内容?

有没有一种方法可以将JSON中的对象视为字符串?

有没有一种方法可以将特殊的非字符键作为字符串类型转换为键类型?(例如,将“ Key.f12”更改为实际的keyboard.Key.f12值)

有没有一种方法可以简化没有宏将Option转换为Result的方法?

有没有一种方法可以从这两个函数中的任何一个创建泛型函数?(将通用数组转换为字符串)

在Spring MVC中,有没有一种简单的方法可以将空表单输入转换为空字符串?

Raku:有没有一种超级快速的方法可以将数组转换为字符串,而无需使用空格分隔元素?

有没有一种快速的方法可以将字符串中的罗马数字转换为R中的阿拉伯语?

有没有一种简单的方法可以使用vbscript将字符串转换为数学表达式?

在Racket中,有没有一种简单的方法可以将字符串转换为变量名(标识符)?

有没有一种方法可以将字符串数组拆分为令牌上的字符串子数组

有没有一种方法可以将所有注释转换为javadoc注释?[Eclipse / Java]

有没有一种方法可以将具有多个if语句的函数转换为箭头函数?

有没有一种方法可以将列中的所有值都转换为小写?

有没有一种工具可以将字符串格式类型自动转换为f字符串?