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 sneakyThrow
cuộc gọi lại OK với trình biên dịch. Nó đã suy ra kiểu khả thi T
nà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ề nonSneakyThrow
cuộc gọi? Họ có vẻ rất giống nhau.
sneakyThrow
cuộc gọi. Các quy định đặc biệt về suy luận củathrows T
các hình thức không tồn tại trong các đặc điểm kỹ thuật của Java 7.