fun getApple(): Apple = {...}
fun setOrange(orange: Orange) {...}
val funMap = hashMapOf("getApple" to this::getApple, "setOrange" to this::setOrange)
funMap["getApple"]()
我想将方法放在地图上。 然后按字符串获取方法,但是如果函数类型不同,则无法调用该方法。还有其他将字符串转换为函数的方法吗?
----更新----
我以前曾经使用过Java反射,我正在寻找一种更有效的方法
答案 0 :(得分:1)
可能,但是您的地图类型为Map<String, KFunction<Any>>
。对于KFunction
,您可以使用方法.call
和.callBy(Map<KParameter, Any>)
。因此,请参见此示例(调用函数时,我还添加了日志记录):
class StackStringFunction {
data class Apple(val size: Int = 1)
data class Orange(val color: String = "orange")
fun getApple(): Apple {
println("Calling getApple()")
return Apple()
}
fun setOrange(orange: Orange) {
println("Calling setOrange(Orange) with param $orange")
}
val funMap = hashMapOf("getApple" to this::getApple, "setOrange" to this::setOrange)
}
// Invocation example:
with(StackStringFunction()) {
this.funMap["getApple"]?.call()
this.funMap["getApple"]?.callBy(mapOf())
this.funMap["setOrange"]?.call(StackStringFunction.Orange())
this.funMap["setOrange"]?.callBy(mapOf(this.funMap["setOrange"]!!.parameters[0]to StackStringFunction.Orange()))
}
输出:
Calling getApple()
Calling getApple()
Calling setOrange(Orange) with param Orange(color=orange)
Calling setOrange(Orange) with param Orange(color=orange)
如您所见,通过::sth
可以获得的不是KFunction
,而是使用KFunction接口可以调用这些方法。
答案 1 :(得分:0)
在kotlin中,Any
是所有层次结构的根类。因此,在方法hashmap中,您可以尝试:-
var funMap : HashMap<String, ()-> Any> = hashMapOf()
funMap.put("getApple" , this::getApple)
funMap.put("setOrange" , this::setOrange)
并在获取方法时:-
funMap["getApple"] as ()-> Apple