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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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传递KType作为泛型参数_Kotlin_Reflection - Fatal编程技术网

Kotlin传递KType作为泛型参数

Kotlin传递KType作为泛型参数,kotlin,reflection,Kotlin,Reflection,我有一种情况,我想调用一个函数来生成一个类型为的对象,我只有一个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 = mut

我有一种情况,我想调用一个函数来生成一个类型为的对象,我只有一个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)
}
内联函数(from:String):T=//好的,老实说,这是一个JSON解析器
...
趣味myOtherFunction(foo:KCallable):MyReturnType{
val args=mutableMapOf()
...
for(foo.parameters中的参数){
...
val argValue=coolFunction(someStringIhave)
args[parameter.name]=argValue
}
...
返回foo.callBy(args)
}

问题当然是
coolFunction(someStringIhave)
的语法不正确。虽然我不知道如何获得正确的语法,但我想我必须使用一些更具反射性的API,但我似乎不知道如何使用。

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

另外,您的
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)
}
fun-coolFunction(from:String,param:KParameter){}//好吧,老实说,这是一个JSON解析器
趣味myOtherFunction(foo:KCallable):MyReturnType{
val args=mutableMapOf()
for(foo.parameters中的参数){
val argValue=coolFunction(“someStringIhave”,参数)
args[参数]=argValue
}
返回foo.callBy(args)
}

问题更多地与第一个函数有关。如果类类型没有参数,它怎么可能返回T,除非您使用具体化类型?对不起,您是对的,它是具体化的。我仍然不知道如何正确地称呼它。我特别使用了
Json.decodeFromString
函数。谢谢。
coolFunction
是kotlinx序列化JSON解析器。我切换到Gson,它有一个带有更合适签名的函数。我试图避免额外的依赖项,但目前看来这是kotlinx json反序列化程序的一个缺点