Когда вы расширяете свой интерфейс для использования двух переменных типа, то есть
private static interface ThrowingMethod<E1 extends Exception,E2 extends Exception> {
void run() throws E1, E2;
}
public <E1 extends Exception,E2 extends Exception>
void wrapMethod(ThrowingMethod<E1,E2> method) throws E1,E2 {
// same as before
}
, правила, касающиеся вывода типа, не меняются, и они одинаковы для обеих переменных типа.Например, вы все равно можете использовать
public void method1() throws ExceptionA {
wrapMethod(super::method1);
}
, как и раньше, поскольку компилятор просто выводит один и тот же тип исключения для обеих переменных типа.
Для метода, объявляющего два исключения, он не выберетвверх один для первой переменной типа и другой для второго;не существует правила, которое могло бы указать компилятору, какое исключение использовать для какой переменной типа.
Но вы можете помочь компилятору в этом случае, например,
public void method2() throws ExceptionB, ExceptionC {
wrapMethod((ThrowingMethod<ExceptionB, ExceptionC>)super::method2);
}
, который является лучшим для вас.можно получить с этим подходом.