代码之家  ›  专栏  ›  技术社区  ›  Georgi Georgiev

java签名解释

  •  2
  • Georgi Georgiev  · 技术社区  · 6 年前

    我看着 Optional 类方法 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-catch 即使原始方法引发 可抛出 对象?

    1 回复  |  直到 6 年前
        1
  •  4
  •   JB Nizet    6 年前
    1. 因为编译器知道的关于您的方法就是抛出一个可丢弃的。由于throwable因此可能是一个选中的异常,所以您必须在throws子句中声明它或捕获它。

    2. 因为编译器知道该方法抛出x,其中泛型类型x被推断为 RuntimeException 以下内容: () -> new RuntimeException("ha") 是一个 Supplier<RuntimeException> .根据定义,运行时异常是不需要在throws子句中声明的未选中异常。

    推荐文章