Допустим, я хочу реализовать версию java.util.function.Function<T,R>
, которая может выдавать какой-то тип исключения E
. Я создал функциональный интерфейс с именем ThrowingFunction
примерно так:
@FunctionalInterface
interface ThrowingFunction<T, R, E extends Exception>
{
R apply(T t) throws E;
}
Теперь, как и в java.util.function.Function<T,R>
, мне нужно реализовать метод по умолчанию compose
, и мне нужно составить два разных ThrowingFunction
экземпляра и, вероятно, они могут иметь другой тип исключения броска . Итак, вот моя попытка:
default <V, E1 extends Exception, E2 super E1 & E> ThrowingFunction<V, R, E2> compose(ThrowingFunction<? super V, ? extends T, ? extends E1> before)
{
return v -> apply(before.apply(v));
}
Здесь, конечно, я получаю сообщение об ошибке компилятора:
Синтаксическая ошибка на токене "super", расширяет ожидаемый
Именно в объявлении универсального параметра E2 super E1 & E
.
Итак, каковы возможные решения этой проблемы, просто составить два разных ThrowingFunction
экземпляра, имеющих один и тот же тип исключения E
(, и это не то, что желательно )?