यह एक 3rd पार्टी लाइब्रेरी एपीआई से एक वास्तविक दुनिया का उदाहरण है, लेकिन सरलीकृत है।
Oracle JDK 8u72 के साथ संकलित
इन दो तरीकों पर विचार करें:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
दोनों एक "अनियंत्रित कास्ट" चेतावनी की रिपोर्ट करते हैं - मुझे क्यों मिलता है। जो चीज मुझे चकित करती है, वह यह है कि मैं क्यों बुला सकता हूं
Integer x = getCharSequence();
और यह संकलन करता है? कंपाइलर को पता होना चाहिए कि Integer
लागू नहीं होता है CharSequence
। के लिए कॉल
Integer y = getString();
एक त्रुटि देता है (उम्मीद के मुताबिक)
incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
क्या कोई समझा सकता है कि इस व्यवहार को वैध क्यों माना जाएगा? यह कैसे उपयोगी होगा?
क्लाइंट को पता नहीं है कि यह कॉल असुरक्षित है - क्लाइंट का कोड बिना किसी चेतावनी के संकलन करता है। संकलन उस के बारे में चेतावनी क्यों नहीं देगा / एक त्रुटि जारी करेगा?
इसके अलावा, यह इस उदाहरण से कैसे अलग है:
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
List<Integer>
उम्मीद के मुताबिक, पास करने की कोशिश में त्रुटि होती है:
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
यदि वह त्रुटि के रूप में रिपोर्ट की गई है, तो क्यों Integer x = getCharSequence();
नहीं?
Integer x = getCharSequence();
संकलित करेगा, लेकिन आरएचएस पर कास्टिंगInteger x = (Integer) getCharSequence();
संकलन विफल हो जाता है