class Foo { public interface Factory { U make(); } interface ASink> { public void combine(K other); } static > R reduce(Factory factory) { return null; } public void foo() { reduce(Moo::new); reduce(AMoo::new); reduce(AAMoo::new); reduce(AAAMoo::new); } private class Moo implements ASink { @Override public void combine(Moo other) { } } private class AMoo { } private class AAMoo implements ASink { @Override public void combine(AAMoo other) { } } private class AAAMoo implements ASink { private AAAMoo() { } @Override public void combine(AAAMoo other) { } } }