Enquanto escrevia o código para outra resposta neste site, me deparei com esta peculiaridade:
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;
}
Em primeiro lugar, estou bastante confuso por que a sneakyThrow
chamada é OK para o compilador. Que tipo possível ele inferiu T
quando não há menção em qualquer lugar de um tipo de exceção não verificado?
Em segundo lugar, aceitando que isso funciona, por que então o compilador reclama na nonSneakyThrow
chamada? Eles parecem muito parecidos.
sneakyThrow
. Os regulamentos especiais sobre a inferência dethrows T
formulários não existiam na especificação do Java 7.