java covariance / contravariance

时间:2012-12-16 14:03:09

标签: java inheritance covariance contravariance

假设我有:

class Event {}
class DoorBell extends Event {}
class PhoneCall extends Event {}
class EventGenerator {
    static Event getEvent() {
         if (today.isSunday())
            return new DoorBell()
         else 
            return new PhoneCall();
    }
}
class EventHandler {    
    void HandleEvent(DoorBell doorBell) { answer door; }
    void HandleEvent(PhoneCall phoneCall) { answer phone; }
    void consumeEvent() {
         Event e = EventGenerator.getEvent();
         HandleEvent(e);
    }
}

由于HandleEvent(Event)未定义,因此HandleEvent(e)无法编译。这有解决方案吗?或者我必须询问它是什么类型的事件?

1 个答案:

答案 0 :(得分:4)

通常的习惯用法是传递一个事件,让多态来处理它。

我认为你EventHandler班没有任何行为没有价值。您所设计的设计不会带来多态效益。这就是你必须检查类型的原因。最好有这样的东西:

public interface EventHandler {
    void handle(Event event);
}

Visitor pattern(又名“双重调度”)可能是处理这种情况的好方法。

或者你可以试试泛型:

public class EventHandler {
   public <T> void consumeEvent(T event) {
       // handler code here, dependent on T
   }
}

我不知道JDK 7是否有新功能可以帮到你。抱歉;我仍然坚持使用JDK 6.