Mientras escribía código para otra respuesta en este sitio, encontré esta peculiaridad:
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;
}
Primero, estoy bastante confundido por qué la sneakyThrow
llamada está bien para el compilador. ¿Qué tipo posible dedujo T
cuando no se menciona en ninguna parte un tipo de excepción sin marcar?
En segundo lugar, aceptando que esto funciona, ¿por qué entonces el compilador se queja en la nonSneakyThrow
llamada? Se parecen mucho.
sneakyThrow
llamada. Las regulaciones especiales sobre la inferencia dethrows T
formas no existían en la especificación de Java 7.