मैं जावा जेनिक्स और कलेक्शन द्वारा मौरिस नाफ्टालिन, फिलिप वाडलर द्वारा पुस्तक पढ़ रहा था, और पहले दो अध्यायों में मैंने अपने सिर को संदेह से गड़बड़ कर लिया। मैं जवाब जानने में सक्षम नहीं था।प्रकार पैरामीटर के डेटाटाइप को कॉन्वर्सिस और contravariance में कैसे तय किया गया है?
कॉल में:
public static <T> void copy(List<? super T> dst, List<? extends T> src) {
for (int i = 0; i < src.size(); i++) {
dst.set(i, src.get(i));
}
}
List<Object> objs = Arrays.<Object>asList(2, 3.14, "four");
List<Integer> ints = Arrays.asList(5, 6);
Collections.copy(objs, ints);
assert objs.toString().equals("[5, 6, four]");
समारोह 'प्रतिलिपि' के लिए कॉल के दौरान:
1 पैरामीटर: = वस्तु
2 पैरामीटर:? = पूर्णांक
लेकिन डेटाप्रकार क्या है टी का? क्षरण कार्यान्वयन के आधार पर यह जेवीएम द्वारा कैसे तय किया जाता है? लाइन Collections.copy में (obj, ints), प्रकार पैरामीटर टी संख्या होने के लिए लिया जाता है:
यह पुस्तक कि में कहा जाता है। कॉल की अनुमति दी है क्योंकि objs टाइप सूची < वस्तु > है, जो सूची की एक उप-प्रकार है < ? सुपर संख्या > (के बाद से वस्तु संख्या की एक महाप्रकार है, के रूप में सुपर द्वारा आवश्यक) और ints है टाइप सूची < पूर्णांक है >, जो सूची < ? का एक उप प्रकार है, संख्या > बढ़ाता है (चूंकि इंटेगर संख्या का उप प्रकार है, जैसा वाइल्डकार्ड विस्तारित करता है)।
लेकिन पूर्णांक Serializable और तुलनीय लागू करता है के रूप में दोनों, संख्या वर्ग और ऑब्जेक्ट वर्ग का विस्तार से aprt Serializable और तुलनीय भी की सुपर प्रकार है।
तो क्यों नहीं टी को संख्या के बजाय सीरियलज़ेबल या तुलनात्मक के रूप में लिया जाता है, क्योंकि प्रतिस्थापन सिद्धांत इसे लेने की अनुमति देगा।
अग्रिम धन्यवाद।
कारण है कि यह फर्क पड़ता है कि वास्तव में क्या टी है में है कि चयन कर सकते हैं? जेनरिक का उपयोग केवल संकलन-समय पर टाइपिंग जांच के लिए किया जाता है, इसलिए संकलक को केवल यह ध्यान रखना चाहिए कि * कुछ * टी काम करता है; इसके अलावा इससे कोई फर्क नहीं पड़ता – newacct