class Test { class Event {} class KeyEvent extends Event { int getCode() { return 0; } } interface EventListener<T extends Event> { void handle(T event); } class EventType<T extends Event>{} static final EventType<KeyEvent> KEY_PRESSED = null; { addEventHandler(KEY_PRESSED, keyEvent -> { int i = keyEvent.getCode(); }); } public final <T extends Event> void addEventHandler(final EventType<T> eventType, final EventListener<? super T> listener) {} }