interface Predicate<T> {} class Foo { static void process(Predicate predicate, C context) {} } interface I {} class Bar implements I { Predicate p; { Foo.process(p, new Bar()); } } class Bar2 { void m(Provider provider) { provider.provide(p()); provider.provide1(1); } static class Provider<T> { void provide(Predicate consumer){ } void provide1(Integer i) {} } Predicate p() { return null; } } class Bar3<K> { class Foo<T> {} void m(Foo rawFoo) {} void n(Bar3 b, Foo rawFoo) { b.m(rawFoo); } }