class Test<T > { interface Event{} interface EventListener<V extends Event> { void handleEvent(V event); } public void addListener(EventListener<? super T> listener) { EventListener<? extends Event> localListener = listener; <error descr="Incompatible types. Found: 'Test.EventListener<capture<? super T>>', required: 'Test.EventListener<? super Test.Event>'">EventListener<? super Event> localListener1 = listener;</error> } } class Test1 { public static class Entity<E extends Entity<E>> { public final <T, V extends EntityVisitor<? super E, T>> T handle(final V visitor) { return visitor.handle(this); } } public interface EntityVisitor<E extends Entity<E>, T> { T handle(Entity<? extends E> e); } }