ในขณะที่เขียนโค้ดสำหรับคำตอบอื่นบนไซต์นี้ฉันพบลักษณะเฉพาะนี้:
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
แบบฟอร์มไม่มีอยู่ในข้อกำหนดของ Java 7