gpt4 book ai didi

java - 参数化通用 Java 事件处理程序的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:53 27 4
gpt4 key购买 nike

我有一些代码如下(摘录):

public interface Event<S> {
S getSource();
}

public interface Subscriber<E> {
void update(E event);
}

public interface EventPublisher<S, E extends Event<S>> {
void addSubscription(S source, Subscriber<E> subscriber);
void removeSubscription(S source, Subscriber<E> subscriber);
}

public class SubscriptionManager<S, E extends Event<S>> implements Subscriber<E>, EventPublisher<S, E> {
...
}

public class MyEvent implements Event<MyEventSource> {
...
}

这一切都很好,但是,我的问题是当我尝试这样的事情时:

public class MyEventHandler {
private final SubscriptionManager<Class<? extends Event<?>>, ? extends Event<?>> subscriptionManager = new SubscriptionManager<>();

Subscriber<? extends Event<?>> subscriber = ...;
subscriptionManager.addSubscription(MyEvent.class, subscriber); **// Compile error**
}

我收到以下错误:

The method addSubscription(Class<? extends Event<?>>, Subscriber<capture#3-of ? extends Event<?>>) in the type SubscriptionManager<Class<? extends Event<?>>,capture#3-of ? extends Event<?>> is not applicable for the arguments (Class<MyEvent>, Subscriber<capture#5-of ? extends Event<?>>)

谁能告诉我哪里出了问题?

谢谢

最佳答案

老实说,我认为您的代码中存在一些设计错误。它几乎看起来像是一个完美设计的模式,但有些东西并没有加起来。您可能可以省略一半的通用参数并使其更直接。

请考虑下面的代码。整个框架由单个参数参数化。一切都编译并且没有使用原始类型。另请注意,框架定义中从未使用过 MyEvent。这是一个便利类。您可以安全地调用 subscriptionManager.update(new MyEvent());在你的代码中的某处。

更复杂的安排也是可能的,但我相信这就是您需要的安排。如果这对您有用,请告诉我。

static interface Event<S> {
S getSource();
}

static interface Subscriber<S> {
void update(Event<S> event);
}

static interface EventPublisher<S> {
void addSubscription(Class<S> sourceClass, Subscriber<S> subscriber);
void removeSubscription(Class<S> sourceClass, Subscriber<S> subscriber);
}

static class SubscriptionManager<S> implements Subscriber<S>, EventPublisher<S> {
public void addSubscription(Class<S> sourceClass, Subscriber<S> subscriber) {
}
public void removeSubscription(Class<S> sourceClass, Subscriber<S> subscriber) {
}
public void update(Event<S> event) {
}
}

static class MyEvent implements Event<String> {
public String getSource() {
return null;
}
}

static class MyEventHandler {
private final SubscriptionManager<String> subscriptionManager = new SubscriptionManager<String>();
public MyEventHandler() {
Subscriber<String> subscriber = null;
subscriptionManager.addSubscription(String.class, subscriber);
}
}

关于java - 参数化通用 Java 事件处理程序的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14530671/

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