我需要处理两种不同类型的事件,但我遇到了以下问题:
接口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 {
....
}
答案 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的漏洞,因为你无法真正使用它。