Cur*_*Guy 3 java generics optional parameterized-constructor
出于好奇,我查看了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"
}
Run Code Online (Sandbox Code Playgroud)
为什么我的方法在没有try-catch
块的情况下不被接受?
为什么即使原始方法抛出一个对象Throwable
,在原始方法中的扩展也不需要
try-catch
块Throwable
?
因为所有编译器都知道你的方法是抛出一个 Throwable。由于 Throwable 因而可能是一个已检查的异常,因此您必须在 throws 子句中声明它或捕获它。
因为编译器知道该方法抛出 X,其中泛型类型 X 被推断为RuntimeException
:() -> new RuntimeException("ha")
是 a Supplier<RuntimeException>
。根据定义,运行时异常是不需要在 throws 子句中声明的未经检查的异常。
归档时间: |
|
查看次数: |
5232 次 |
最近记录: |