Java сохраняет универсальный тип в карте верхней границы подстановочного знака - PullRequest
0 голосов
/ 16 октября 2018

Начиная с этих классов

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 <?расширяет событие>, которое ожидает захват <?расширяет Event> в методе процесса.

Как я могу обойти это?

1 Ответ

0 голосов
/ 16 октября 2018

Это может быть достигнуто с небольшими изменениями в вашем коде.

  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);
    }
    
...