Pisząc kod dla innej odpowiedzi na tej stronie, natknąłem się na tę osobliwość:
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;
}
Po pierwsze, jestem dość zdezorientowany, dlaczego sneakyThrow
wywołanie kompilatora jest OK. Jaki możliwy typ to wywnioskowało, T
kiedy nigdzie nie ma wzmianki o niezaznaczonym typie wyjątku?
Po drugie, przyjmując, że to działa, dlaczego kompilator narzeka na nonSneakyThrow
wywołanie? Wydają się do siebie bardzo podobni.
sneakyThrow
wezwanie. Specjalne przepisy dotyczące wnioskowania zthrows T
formularzy nie istniały w specyfikacji Java 7.