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 sneakyThrowllamada está bien para el compilador. ¿Qué tipo posible dedujo Tcuando 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 nonSneakyThrowllamada? Se parecen mucho.
sneakyThrowllamada. Las regulaciones especiales sobre la inferencia dethrows Tformas no existían en la especificación de Java 7.