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); } } } class Test1 { class ResolveResult { } class A { } class B extends A { } abstract class AbstractResolver { } abstract class Resolver extends AbstractResolver { } public ResolveResult[] resolveWithCaching(T ref, Resolver resolver) { return null; } public TResult resolveWithCaching(TRef ref, AbstractResolver resolver) { return null; } { Resolver resolver = null; B b = null; resolveWithCaching(b, resolver); } }