При написании кода для другого ответа на этом сайте я столкнулся с этой особенностью:
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? Они кажутся очень похожими.