이 사이트에서 다른 답변에 대한 코드를 작성하는 동안 다음과 같은 특징을 발견했습니다.
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
호출이 컴파일러에 대해 괜찮은지 혼란 스럽습니다 . T
확인되지 않은 예외 유형에 대한 언급이없는 경우 가능한 유형은 무엇입니까 ?
둘째, 이것이 작동한다는 것을 받아들이면 왜 컴파일러가 nonSneakyThrow
호출 에 대해 불평 합니까? 그들은 매우 비슷해 보입니다.
sneakyThrow
전화 를 의미해야합니다 . 의 추론에 대한 특별한 규정throws T
양식은 자바 7의 사양에 존재하지 않았다