2

我正在用 Java 制作一个事件系统,但在编写 Listener 部分时遇到了问题。

这是我目前的Listener课程:

public interface Listener<E extends Event<?>> {
    public void handleEvent(E event);
}

我想保持它的可扩展性,使我可以拥有一个可以灵活适应任何事件类型的 Listener 类,即Listener<Foo>andListener<Bar>而不是FooListenerand BarListener,但我也希望实现类能够监听多个事件。

我的问题是一个类不能用两个不同的类型参数实现 Listener 类。

public class MultiListener implements Listener<Foo>, Listener<Bar> {
    // does not work
}

我知道一个方法可能有无限数量的参数,如下所示:

public void toInfinityAndBeyond(String... lotsOfStrings) {

}

但是我的Listener班级可以有无限数量的类型参数来监听多个事件吗?

public class MultiListener implements Listener<ThisEvent, ThatEvent, AnotherEvent> {
    // hypothetical
}
4

2 回答 2

4

问题在于,由于泛型类型擦除Listener<Foo>Listener<Bar>它们实际上是完全相同的接口。所以这是不可能的(AFAIK)。

于 2013-07-05T21:09:20.237 回答
0

我不完全理解泛型,但我发现它们倾向于使 Java,一种静态类型的语言,更加静态。这可能是件好事。但是你正在尝试做的是相当动态的。

所以在这种情况下,我会转储泛型。使 Foo 和 Bar 扩展或实现 Event。(没有“<>”的事件。)确保 Event 类有足够的方法,使得 Listener 的 handleEvent() 中的代码不需要多个ifusing instanceof; 所以它可以只处理普通的 Event 对象。(请注意,通常情况下偶尔instanceof不会伤害任何东西。)

于 2013-07-24T20:08:15.083 回答