interface Listener {} class Adapter implements Listener {} class Super { public > C apply(C configurer) throws Exception { return null; } public > C apply(C configurer) throws Exception { return null; } } class AdapterImpl extends Adapter{} class Child extends Super {} class D { void foo(Child ch, AdapterImpl a) throws Exception { ch.apply(a); } } class Test { interface Listener {} class Adapter implements Listener {} class Super { public & Runnable> C apply(C configurer) throws Exception { return null; } public & Runnable> C apply(C configurer) throws Exception { return null; } } abstract class AdapterImpl extends Adapter implements Runnable{} class Child extends Super {} class D { void foo(Child ch, AdapterImpl a) throws Exception { ch.apply( a); } } }