के साथ मुद्दा
List<String> list = new LinkedList();
यह है कि बाएं हाथ की तरफ, आप जेनेरिक प्रकार का उपयोग कर रहे हैं List<String>
जहां दाईं ओर आप कच्चे प्रकार का उपयोग कर रहे हैं LinkedList
। जावा में कच्चे प्रकार केवल पूर्व-जेनरिक कोड के साथ संगतता के लिए प्रभावी रूप से मौजूद हैं और नए कोड में कभी भी उपयोग नहीं किया जाना चाहिए जब तक कि आपको पूरी तरह से नहीं करना पड़े।
अब, यदि जावा के पास शुरू से ही जेनेरिक थे और उनके पास प्रकार नहीं LinkedList
थे , जैसे कि , मूल रूप से जेनेरिक होने से पहले मूल रूप से बनाए गए थे, तो शायद यह ऐसा हो सकता था ताकि जेनेरिक प्रकार के लिए निर्माता स्वचालित रूप से बाईं ओर से अपने प्रकार के मापदंडों को संक्रमित कर सके। यदि संभव हो तो असाइनमेंट के किनारे। लेकिन यह नहीं किया, और यह कच्चे प्रकार और सामान्य प्रकार के पीछे की संगतता के लिए अलग-अलग व्यवहार करना चाहिए। यह उनके प्रकार के मापदंडों को दोहराए बिना एक सामान्य वस्तु के एक नए उदाहरण की घोषणा करने के तरीके के लिए उन्हें थोड़ा अलग , लेकिन समान रूप से सुविधाजनक बनाने की आवश्यकता होती है , हीरा ऑपरेटर।
जहाँ तक आपका मूल उदाहरण है List<String> list = new LinkedList()
, संकलक उस असाइनमेंट के लिए एक चेतावनी उत्पन्न करता है क्योंकि यह होना चाहिए। इस पर विचार करो:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
गलत काम करने के खिलाफ संकलन-समय सुरक्षा प्रदान करने के लिए जेनरिक मौजूद हैं। उपरोक्त उदाहरण में, कच्चे प्रकार का उपयोग करने का मतलब है कि आपको यह सुरक्षा नहीं मिलती है और रनटाइम में एक त्रुटि मिलेगी। यही कारण है कि आपको कच्चे प्रकारों का उपयोग नहीं करना चाहिए।
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
हीरा ऑपरेटर, हालांकि, असाइनमेंट के दाहिने हाथ की ओर को एक ही प्रकार के मापदंडों के साथ एक वास्तविक सामान्य उदाहरण के रूप में परिभाषित करने की अनुमति देता है ... फिर से उन मापदंडों को टाइप किए बिना। यह आपको कच्चे प्रकार का उपयोग करते हुए लगभग उसी प्रयास के साथ जेनरिक की सुरक्षा रखने की अनुमति देता है ।
मुझे लगता है कि समझने वाली महत्वपूर्ण बात यह है कि कच्चे प्रकार (नहीं के साथ <>
) को सामान्य प्रकार के समान नहीं माना जा सकता है। जब आप एक कच्चे प्रकार की घोषणा करते हैं, तो आपको कोई भी लाभ नहीं मिलता है और जेनेरिक की जांच की जाती है। आपको यह भी ध्यान रखना होगा कि जेनेरिक जावा भाषा का एक सामान्य उद्देश्य हिस्सा है ... वे सिर्फ एस के नो-आर्ग कन्स्ट्रक्टर्स पर लागू नहीं होते हैं Collection
!