在Java中实现通用接口

whi*_*uts 27 java generics cqrs

我有一个Java泛型问题我希望有人可以回答.请考虑以下代码:

public interface Event{}
public class AddressChanged implements Event{}
public class AddressDiscarded implements Event{}

public interface Handles<T extends Event>{
    public void handle(T event);
}
Run Code Online (Sandbox Code Playgroud)

我想像这样实现这个Handles接口:

public class AddressHandler implements Handles<AddressChanged>, Handles<AddressDiscarded>{
    public void handle(AddressChanged e){}
    public void handle(AddressDiscarded e){}
}
Run Code Online (Sandbox Code Playgroud)

但java不允许使用Generic两次实现Handles.我能够用C#实现这一点,但是如果不使用Reflection或instanceof和cast,就无法在java中找到解决方法.

在Java中有没有办法使用两个通用接口实现Handles接口?或者也许是另一种编写Handles接口的方法,以便完成最终结果?

Sta*_*lin 19

追求@Amir Raminfar,您可以使用访客模式

interface Event{
 void accept(Visitor v);
}
interface Visitor {
 void visitAddressChanged(AddressChanged a);
 void visitAddressDiscarded(AddressDiscarded a);
}

class AddressChanged implements Event{
 @Override
 public void accept(Visitor v) {
  v.visitAddressChanged(this);
 } 
}

class AddressDiscarded implements Event{
 @Override
 public void accept(Visitor v) {
  v.visitAddressDiscarded(this);
 } 
}

class AddressHandler implements Visitor {
    void handle(Event e){
       e.accept(this);
     }
    public void visitAddressChanged(AddressChanged e){}
    public void visitAddressDiscarded(AddressDiscarded e){}
}
Run Code Online (Sandbox Code Playgroud)


Ami*_*far 10

你不能用Java做到这一点.您只能实现相同通用接口的一个具体实现.我会这样做:

public class AddressHandler implements Handles<Event>{
    public void handle(Event e){
      if(e instanceof AddressDiscarded){
         handleDiscarded(e);
      } else if(e instanceof AddressChanged){
         handleChanged(e);
      }
    }
    public void handleDiscarded(AddressDiscarded e){}
    public void handleChanged(AddressChanged e){}
}
Run Code Online (Sandbox Code Playgroud)

  • @Don:不是同一个通用接口的多个实例.这就是我们所说的.:P (5认同)
  • 这是有争议的......这个"级联实例"是一个非常程序化的程序.当然它的作品,但恕我直言,它不是很好的风格.但是因此有不同的方法名称可能也不完美,这可能是一个品味问题. (4认同)
  • 这就是我要做的.你不必:) (2认同)