实现多个通用接口

时间:2012-07-02 08:56:12

标签: java generics

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

接口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 {
....
}

2 个答案:

答案 0 :(得分:6)

现实中只有一种句柄(Object)方法。你实际上和

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

如果没有此检查逻辑,则无论如何都无法有效地调用事件侦听器。

答案 1 :(得分: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的方法命名方法,其参数是一个Fraction,那么它必须选择方法2,两者都可以作为一个Fraction也是一个Number。做这样的事情是愚蠢的,但没有保证人们不会,如果他们做java,将不知道该怎么做。

&#34;解决方案&#34;我想出的就是重新命名这些函数。

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的漏洞,因为你无法真正使用它。