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"
}
try-catch
ブロックなしでメソッドが受け入れられないのはなぜですか?元のメソッドがオブジェクトをスローしても、元のメソッドのように拡張するのにブロック
Throwable
が必要ないのはなぜですか?try-catch
Throwable