如何从HashMap中调用函数?以调用Info.sendInfo函数为例
在Kotlin中通过HashMap调用函数的正确实现
你的代码目前存在核心问题:你并没有把函数存入Map,而是直接执行了函数并将返回的Unit类型结果存了进去,所以后续无法通过Map中的值调用目标函数。下面是修正方案:
问题分析
当前代码里的"!info" to Info.sendInfo(event)会立即执行Info.sendInfo(event),并把这个函数的返回值(Unit)作为Map的值存储。而Unit类型并没有runFunction方法,这会导致编译错误,同时也完全达不到“通过Map触发函数调用”的目的。
正确实现方式
我们需要把**函数本身(函数引用)**存入Map,而不是函数执行后的结果。具体步骤如下:
- 定义Map的类型为
Map<String, (MessageReceivedEvent) -> Unit>,其中(MessageReceivedEvent) -> Unit表示“接收一个MessageReceivedEvent参数、返回Unit的函数类型”。 - 存入函数时,使用函数引用语法
::Info.sendInfo(假设sendInfo是Info类中的伴生对象方法或顶层函数),不要加括号调用。 - 从Map中取出函数后,先判空避免空指针,再传入参数执行。
修正后的代码:
abstract class Listener : ListenerAdapter() { fun checkCommand(args: List<String>, event: MessageReceivedEvent) { // 定义存储函数引用的Map val commandMap: Map<String, (MessageReceivedEvent) -> Unit> = mapOf( "!info" to ::Info.sendInfo ) // 取出函数并执行 commandMap[args[0]]?.invoke(event) } }
补充说明
- 如果
Info.sendInfo是实例方法(需要Info类的对象才能调用),那么你需要先持有Info的实例,然后用infoInstance::sendInfo作为函数引用存入Map。 - 使用
?.invoke(event)是安全调用:如果args[0]不在Map的键中,函数引用为null,此时不会执行任何操作,避免空指针异常。
内容的提问来源于stack exchange,提问作者paspielka
相关产品推荐
相关产品推荐

