import java.util.function.Supplier; import java.util.function.BiFunction; import java.util.function.Function; interface Regression { , FB extends Functor> FT apply( Function fn, S s); static Regression regression(Function getter, BiFunction setter) { return new Regression() { @Override @SuppressWarnings("unchecked") public , FB extends Functor> FT apply( Function fn, S s) { return null; //doesn't matter } }; } @SuppressWarnings("unchecked") static Simple simple(Function getter, BiFunction setter) { return regression(getter, setter)::apply; // java9 fails to compile this line } interface Functor { } @FunctionalInterface interface Simple extends Regression { } } interface SimplifiedTest { > FB apply(Supplier fn); static SimplifiedTest simple(final SimplifiedTest regression) { return regression::apply; } interface Functor { } }