Java の throws 節では型変数が使える

つい先だって知ったのですが、 Java のメソッドの throws 節では型変数が使えます。

これによって、投げる可能性のある例外の型が使い手側で変えられるようなメソッドを書くことができます。たとえば次のプログラムのように、例外の型と例外オブジェクトの生成を使い手にまかせる汎用の表明メソッドが書けます。 *1

class Checker {
    static <T extends Throwable> void
    check(boolean condition, Supplier<T> supplier) throws T {
        if (! condition) {
            throw supplier.get();
        }
    }
}

class SomeException extends Exception {
}

public class Main {
    public static void main() throws SomeException {
        Checker.check(isEverythingGoingWell()
                , () -> new SomeException("Boo"));
    }
}

標準 API の中では、 Optional.orElseThrow がこのような設計になっています。

*1:表明はチェック例外を投げるべきでないので、この例はいまいちです。他に思い付かなかった。