interface Listener<A0, B0> {} class Adapter<A, B> implements Listener<A, B> {} class Super<O, B> { public <C extends Adapter<O, B>> C apply(C configurer) throws Exception { return null; } public <C extends Listener<O, B>> C apply(C configurer) throws Exception { return null; } } class AdapterImpl extends Adapter<String, String>{} class Child<O, B> extends Super<O, B> {} class D { void foo(Child<String, String> ch, AdapterImpl a) throws Exception { ch.apply(a); } } class Test { interface Listener<A0, B0> {} class Adapter<A, B> implements Listener<A, B> {} class Super<O, B> { public <C extends Adapter<O, B> & Runnable> C apply(C configurer) throws Exception { return null; } public <C extends Listener<O, B> & Runnable> C apply(C configurer) throws Exception { return null; } } abstract class AdapterImpl extends Adapter<String, String> implements Runnable{} class Child<O, B> extends Super<O, B> {} class D { void foo(Child<String, String> ch, AdapterImpl a) throws Exception { ch.apply( a); } } } class Test1 { class ResolveResult { } class A { } class B extends A { } abstract class AbstractResolver<K, V> { } abstract class Resolver<K> extends AbstractResolver<K, ResolveResult[]> { } public <T extends B> ResolveResult[] resolveWithCaching(T ref, Resolver<T> resolver) { return null; } public <TRef extends A, TResult> TResult resolveWithCaching(TRef ref, AbstractResolver<TRef, TResult> resolver) { return null; } { Resolver<B> resolver = null; B b = null; resolveWithCaching(b, resolver); } }