При написании кода для другого ответа на этом сайте я обнаружил такую особенность:
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.