java 如何在参数中找到提供给Consumer的Object的类?

gopyfrb3  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(122)

我正在创建一个包含多种类型事件的事件系统,例如ExampleEvent extends Event。我需要使用以下语法,通过lambda/consumer找出提供给钩子函数的事件类型:

hook(
    (ExampleEvent e) -> e.example(),
    (ExampleEvent2 e) -> // code here
);

这是我目前所拥有的,我需要将消费者添加到Map中,以便在每次调用事件时运行它们。有什么方法可以实现这一点吗?有没有更好的方法可以实现这一点?

static Map<Class, ArrayList<Consumer<? extends Event>>> hooks = new HashMap<>();

public static void hook(Consumer<? extends Event> ...consumers) {
    for(Consumer<? extends Event > fn : consumers) {
        final Class klass = // class supplied in lambda function

        if(hooks.containsKey(klass)) {
            hooks.get(klass).add(fn);
        } else {
            hooks.put(klass, new ArrayList<>(fn));
            hooks.get(klass).add(fn);
        }
    }
}

public static void fire(Event event) {
    ArrayList<Consumer<? extends Event>> classHooks = hooks.get(event.getClass());
    if(classHooks == null) {
        return;
    }

    for(Consumer c : classHooks) {
        c.accept(event);
    }
}

我尝试了一些方法,但找不到一种方法来使它工作。

kse8i1jr

kse8i1jr1#

你需要放弃一次注册多个消费者的想法,一次注册一个消费者,为每个消费者提供事件类。下面是如何以类型安全的方式完成这件事:

public static <E extends Event> void hook( Class<E> eventClass,
        Consumer<E> consumer );

相关问题