このサイトで別の答えのコードを書いているときに、私はこの特異性に出くわしました。
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;
}
まず、sneakyThrow
コンパイラーにとって呼び出しがOKである理由がかなり混乱しています。T
チェックされていない例外タイプのどこにも言及がない場合、どのようなタイプが推測されましたか?
第二に、これが機能することを受け入れると、なぜコンパイラはnonSneakyThrow
呼び出しで文句を言うのですか?それらは非常に似ているようです。
sneakyThrow
呼び出しを意味する必要があります。推論に関する特別規則throws T
フォームのJava 7の仕様には存在しませんでした