实现多个通用接口
我需要处理两种不同类型的事件,但我遇到了以下问题:
接口EventListener不能使用不同的参数多次实现: EventListener
和EventListener
。
有一个优雅的解决方案吗?
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的漏洞,因为你无法真正使用它。