首页 > 解决方案 > Kotlin 将 KType 作为泛型参数传递

问题描述

我有一种情况,我想调用一个函数来生成一个我只有 KType 描述的类型的对象。

基本上我有:

inline fun<reified T> coolFunction(from : String) : T = // Okay, I'll be honest - its a JSON parser
...
fun myOtherFunction(foo : KCallable<MyReturnType>) : MyReturnType {
    val args = mutableMapOf<KParameter, Any?>()
    ...
    for (parameter in foo.parameters) {
        ...
        val argValue = coolFunction<parameter.type>(someStringIhave)
        args[parameter.name] = argValue
    }
    ...
    return foo.callBy(args)
}

问题当然coolFunction<parameter.type>(someStringIhave)是语法不正确。虽然我不知道如何获得正确的语法,但我认为我将不得不使用一些更具反射性的 API,但我似乎无法弄清楚如何。

标签: kotlinreflection

解决方案


您应该更改您coolFunction的参数以获取参数。它不能用通用函数来完成。不幸的是,你没有为你提供代码coolFunction,我无法帮助你实现它,但如果你想这样做,你应该传递类而不是使用泛型。如果您在酷函数中调用其他通用函数,请全部更改。传递参数并在你的酷函数中处理它。你不能这样称呼它,没有办法。您必须更改签名。

另外,你args错了。键应该是参数,而不是它们的名称。我纠正了它。

fun coolFunction(from: String, param: KParameter) {} // Okay, I'll be honest - its a JSON parser

fun myOtherFunction(foo : KCallable<String>) : MyReturnType {
    val args = mutableMapOf<KParameter, Any?>()

    for (parameter in foo.parameters) {
        val argValue = coolFunction("someStringIhave", parameter)
        args[parameter] = argValue
    }

    return foo.callBy(args)
}

推荐阅读