Реализованный метод FOptional::flatMap
не соответствует определению в интерфейсе Monad
.
Все, что вам нужно, это изменить сам интерфейс Monad
:
interface Monad<T, M extends Monad<?, ?>> extends Functor<T, M> {
<R> M flatMap(Function<T, FOptional<R>> f);
}
Более того, насколько я понимаю из функциональности, оба интерфейса должны быть спроектированы в одном духе. Сравните новый интерфейс с интерфейсом Functor
:
interface Functor<T, F extends Functor<?, ?>> {
<R> F map(Function<T, R> f);
}
Оба они определяют методы, которые возвращают новый универсальный тип: Monad
с M
и Functor
с F
и используют недавно введенный универсальный тип R
.