इस साइट पर एक और उत्तर के लिए कोड लिखते समय मैं इस विशिष्टता में आया:
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. के विनिर्देश में मौजूद नहीं था