5

我需要处理两种不同类型的事件,但我遇到了以下问题:

接口 EventListener 不能使用不同的参数多次实现:EventListener<PriceUpdate>EventListener<OrderEvent>

有没有一个优雅的解决方案?

public interface EventListener <E> {
    public void handle(E event);
}
public interface PriceUpdateEventListener extends EventListener<PriceUpdate> {
}
public interface OrderEventListener extends EventListener<OrderEvent> {
}

public class CompositeListener implements OrderEventListener,PriceUpdateEventListener {
....
}
4

2 回答 2

6

现实中只有一种 handle(Object) 方法。你实际上写的是一样的

public class CompositeListener implements EventListener {
    public void handle(Object event) {
        if (event instanceof PriceUpdate) {
            ///
        } else if (event instanceof OrderEvent) {
            ///
        }
    }
}

如果没有这个检查逻辑,你无论如何都不能有效地调用你的事件监听器。

于 2012-07-02T09:01:12.917 回答
0

我正在尝试在我的项目中做同样的事情,但似乎没有任何优雅的方式可以做到这一点。问题是通用接口方法的所有不同版本都具有相同的名称,并且可以将相同的参数应用于它们。至少如果您正在使用子类,并且不能保证您不会,它不会编译。至少这是我认为正在发生的事情。

class Fraction extends Number{
...
}
GenericInteface <T> {
void method(T a);
}

NumberInterface extends GenericInteface <Number>{
}
FractionInterface extends GenericInteface <Fraction>{
}
ClassWithBoth implements NumberInterface, FractionInterface{
void method(Number a){
}
void method(Fraction a){
}}

在这个例子中,如果调用 ClassWithBoth 的方法命名方法,参数是分数,它必须从方法 2 中选择,两者都可以作为分数也是数字。做这样的事情是愚蠢的,但不能保证人们不会这样做,而且如果他们这样做 java 将不知道该怎么做。

我想出的“解决方案”是像这样重命名函数。

class Fraction extends Number{
...
}
GenericInteface <T> {
void method(T a);
}
NumberInterface {
void numberMethod(Number a);
}
FractionInterface {
void fractionMethod(Fraction a);
}
ClassWithBoth implements NumberInterface, FractionInterface{
void numberMethod(Number a){
}
void fractionMethod(Fraction a){
}}

可悲的是,这有点消除了首先拥有 GenericInterface 的漏洞,因为你不能真正使用它。

于 2014-07-15T10:18:32.810 回答