Під час написання коду для іншої відповіді на цьому сайті я натрапив на цю особливість:
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.