当我在这个网站上为另一个答案编写代码时,我发现了一个特点:
static void testSneaky() {
final Exception e = new Exception();
sneakyThrow(e); //no problems here
nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception
}
@SuppressWarnings("unchecked")
static <T extends Throwable> void sneakyThrow(Throwable t) throws T {
throw (T) t;
}
static <T extends Throwable> void nonSneakyThrow(T t) throws T {
throw t;
}
首先,我很困惑为什么对编译器的 sneakyThrow
调用是 OK 的。当没有提到任何未检查的异常类型时,它为 T
推断出了什么可能的类型?
第二,接受这个工作原理,那么为什么编译器要在 nonSneakyThrow
调用中抱怨呢。