Trong khi viết mã cho một câu trả lời khác trên trang web này, tôi đã bắt gặp điều đặc biệt này:
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;
}
Đầu tiên, tôi khá bối rối tại sao sneakyThrowcuộc gọi lại OK với trình biên dịch. Nó đã suy ra kiểu khả thi Tnào khi không có đề cập ở bất kỳ đâu của kiểu ngoại lệ không được kiểm tra?
Thứ hai, chấp nhận rằng điều này hoạt động, tại sao sau đó trình biên dịch lại phàn nàn về nonSneakyThrowcuộc gọi? Họ có vẻ rất giống nhau.
sneakyThrowcuộc gọi. Các quy định đặc biệt về suy luận củathrows Tcác hình thức không tồn tại trong các đặc điểm kỹ thuật của Java 7.