Если первый пример сработает, рассмотрите следующее:
Supplier<InterruptedException> s = this::exceptionSupplier;
В таком случае произойдет сбой с ClassCastException
, если вы назвали его так:
InterruptedException e = s.get();
Этопотому что X
определяется на сайте вызова.Компилятор вставляет неявное приведение:
InterruptedException e = (InterruptedException) s.get();
Но, конечно, s
возвращает вам RuntimeException
, который не может быть приведен к InterruptedException
.
Если вы хотите вернуть RuntimeException
, сделайте тип возврата метода RuntimeException
, переменная типа не требуется.