实现多个通用接口

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

接口EventListener不能使用不同的参数多次实现: EventListenerEventListener

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

 public interface EventListener  { public void handle(E event); } public interface PriceUpdateEventListener extends EventListener { } public interface OrderEventListener extends EventListener { } public class CompositeListener implements OrderEventListener,PriceUpdateEventListener { .... } 

实际上只有一种句柄(Object)方法。 你实际上写的是一样的

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

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

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

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

在这个例子中,如果有些东西正在调用ClassWithBoth的方法命名方法,其参数是一个Fraction,那么它必须选择方法2,两者都可以作为Fraction也是一个Number。 做这样的事情是愚蠢的,但人们没有保证,如果他们这样做,java将不知道该怎么做。

我提出的“解决方案”是重命名function,就像这样。

 class Fraction extends Number{ ... } GenericInteface  { 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的漏洞,因为你无法真正使用它。