gpt4 book ai didi

generics - 将通用 lambda 放入映射中

转载 作者:行者123 更新时间:2023-12-02 20:06:21 25 4
gpt4 key购买 nike

好的,下面的代码是一个执行以下操作的事件系统:

  1. 将整数 ID 分配给 lambda 表达式
  2. 将 lambda 的 id 放入事件的可变集中
  3. 将整数 ID 映射到 lambda 表达式
  4. 返回 id(稍后可用于从 lambda 中删除事件)

代码如下:

class EventHandler {
companion object {
val handlers = HashMap<KClass<out Event>, MutableSet<Int>>()
val idMap = HashMap<Int, (Event) -> Unit>();

/**
* @param event Class of the event you are registering
* @param handler What to do when the event is called
*/
fun <T : Event> register(event: KClass<T>, handler: (T) -> Unit): Int {
var id: Int = 0;
while(idMap[id] != null) {
id++;
}
var list = handlers.getOrPut(event, {mutableSetOf()});
list.add(id);
idMap[id] = handler;
return id;
}
}
}

此方法的预期用途如下:

EventHandler.register(ChatEvent::class) { onChat ->
println(onChat.message)
}

以下行有错误:idMap[id] = handler;

该错误是因为处理程序的类型为 (T) -> Unit,尽管它需要为 (Event) -> Unit 才能将其添加到idMap。虽然我在创建 T 时说过应该扩展 Event ,所以这应该不是问题。如果有解决方案,有人知道为什么会发生这种情况吗?

最佳答案

问题来自于 idMap 采用接收 Event 的函数 - 任何 类型的 Event。然后,您尝试注册一个采用 Event 的指定子类的函数,当您将其拉回时,编译器将无法判断它接收到的可能的子类。是的,您将特定类型存储在其他映射中,但编译器无法使用它。

我不相信您可以创建您想要创建的 map 系统。并非没有更多的间接或抽象层......

关于generics - 将通用 lambda 放入映射中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35973872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com