在此站点上为另一个答案编写代码时,我遇到了这种特殊性:
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
对编译器的调用正常。T
当未提及任何未经检查的异常类型时,它推断出什么可能的类型?
其次,接受这一工作原理后,为什么编译器会在nonSneakyThrow
调用中抱怨?他们看起来非常相似。
sneakyThrow
电话。关于推理的特殊法规throws T
的形式并没有在Java 7中的规范存在