4

Optional好奇心からクラス メソッドを調べたところ、orElseThrowそのシグネチャに混乱しました。なぜそれをそのまま宣言する必要があるのか​​ わかりませんでした。そこで、元のorElseThrowメソッドのコピーと単純化したバリアントを使用して実験を行いました。

public class Main<T> {

    //This is original signature of Optional.orElseThrow method 
    public  <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X{

            throw exceptionSupplier.get();
    }

    //This is my attempt to simplify it but it doesn't work without try-catch block
    public T orElseThrow2(Supplier<Throwable> exceptionSupplier) throws Throwable{

        throw exceptionSupplier.get();
    }

    public static void main(String[] args){
        Main<Object> m = new Main<Object>();

            m.orElseThrow(() -> new RuntimeException("ha")); //no warnings/errors shown

            m.orElseThrow2(() -> new RuntimeException("sad")); //"Unhandled exception: java.lang.Throwable"
}
  1. try-catchブロックなしでメソッドが受け入れられないのはなぜですか?

  2. 元のメソッドがオブジェクトをスローしても、元のメソッドのように拡張するのにブロックThrowableが必要ないのはなぜですか? try-catchThrowable

4

2 に答える 2