Java сохраняет универсальный тип в карте верхней границы подстановочного знака
Начиная с этих классов
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 ответ
Это может быть достигнуто с помощью нескольких изменений в вашем коде.
использование
OneEvent
что вы параметризуетеOneEventProcessor
с:class OneEventProcessor implements EventProcessor<OneEvent> { @Override public Stream<OneEvent> process(OneEvent element) { return null; } @Override public EventType getType() { return EventType.ONE; } }
Используйте правильно
T
что вы параметризуетеEventProcessor
с:interface EventProcessor<T extends Event> { Stream<T> process(T element); EventType getType(); }
Добавьте правильные границы типа к вашему
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); }