Durante la scrittura di codice per un'altra risposta su questo sito mi sono imbattuto in questa particolarità:Una caratteristica peculiare del tipo di eccezione l'inferenza in Java 8
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;
}
In primo luogo, sono abbastanza confuso perché la chiamata sneakyThrow
è OK per il compilatore . Quale tipo possibile ha inferito per T
quando non si fa menzione di alcun tipo di eccezione non controllata?
In secondo luogo, accettando che funzioni, perché il compilatore si lamenta della chiamata nonSneakyThrow
? Sembrano molto simili.
Perché la prima riga ha anche un errore in Java 7? – Maksym
@Maksym Si deve intendere la chiamata 'sneakyThrow'. Le regole speciali sull'inferenza delle forme 'getta T' non esistevano nelle specifiche di Java 7. –
Piccola nitpick: In' nonSneakyThrow', 'T' deve essere' Exception', non "un supertipo di" 'Exception', perché è esattamente il tipo di argomento dichiarato in fase di compilazione nel sito di chiamata. – llogiq