1

从这些课程开始

public class Event {

   private EventType eventType;

   public EventType getEventType() {
       return eventType;
   }

   public void setEventType(EventType eventType) {
       this.eventType = eventType;
   }
}

public class OneEvent extends Event {

   public OneEvent() {
       setEventType(EventType.ONE);
   }
}


public interface EventProcessor<T extends Event> {

   Stream<? extends Event> process(T element);

   EventType getType();

}

public enum EventType {
    ONE, TWO
}

我创建了实现它的 OneEventProcessor 和 TwoEventProcessor。

public class OneEventProcessor implements EventProcessor<OneEvent> {

@Override
public Stream<? extends Event> process(OneEvent element) {
    return null;
}

@Override
public EventType getType() {
    return EventType.ONE;
}

}

在另一个类中,我想将它们添加到地图类型-> 处理器中,然后检索和使用。

Map<EventType, EventProcessor<? extends Event>> map = new HashMap<>();
OneEventProcessor oep = new OneEventProcessor();
map.put(oep.getType(), oep);

public Stream<? extends Event> process(Event event) {
    return map.get(event.getEventType()).process(event);
}

这不起作用,因为地图将检索 EventProcessor< ? 扩展事件 > 期望捕获 < ? 扩展事件 > 进程中的方法。

有什么办法可以解决这个问题吗?

4

1 回答 1

0

这可以通过对代码进行少量更改来实现。

  1. 使用OneEvent您参数化OneEventProcessor的:

    class OneEventProcessor implements EventProcessor<OneEvent> {
    
         @Override
         public Stream<OneEvent> process(OneEvent element) {
             return null;
         }
    
         @Override
         public EventType getType() {
             return EventType.ONE;
         }
     }
    
  2. 正确使用T参数化EventProcessor

    interface EventProcessor<T extends Event> {
    
        Stream<T> process(T element);
    
        EventType getType();
    }
    
  3. 为您的方法添加适当的类型边界process()(为简洁起见,我在该方法的主体中包含了映射初始化):

    public <T extends Event> Stream<T> process(T event) {
        Map<EventType, EventProcessor<T>> map = new HashMap<>();
        EventProcessor oep = new OneEventProcessor();
        map.put(oep.getType(), oep);
        return map.get(event.getEventType()).process(event);
    }
    
于 2018-10-15T21:28:13.720 回答