दिलचस्प पोस्ट
जावा लॉजिकल ऑपरेटर शॉर्ट सर्किटिंग दोहराएँ स्ट्रिंग – जावास्क्रिप्ट कई विशेषताओं द्वारा एक सूची को सॉर्ट करें? एंड्रॉइड में प्रगति बार की प्रगति रंग कैसे बदल सकता है जावास्क्रिप्ट ऑब्जेक्ट कुंजी सूची प्राप्त करना कौन सा एल्गोरिथ्म ज्यादातर सॉर्ट किए गए डेटा पर सर्वोत्तम काम करता है? रेल में उपडोमेन के बीच सत्र (कुकीज़) साझा करें? संदर्भ से स्विफ्ट पास मूल्य या पास है मैं पायथन में कच्चे इनपुट की कई पंक्ति कैसे पढ़ूं? वीएस 2010 परियोजना के बाहरी उपयोग के लिए IIS एक्सप्रेस को कॉन्फ़िगर करें I एंड्रॉइड में एसेट फ़ोल्डर या कच्चे फ़ोल्डर में फाइल कैसे लिखनी है? jQuery को गतिशील रूप से जोड़ा HTML तत्व के लिए onclick घटना बाँध कैसे करें क्या आप को.एपली कॉल कर सकते हैं आंशिक दृश्य को बाइंडिंग करने के लिए? HTML तालिका के लिए JSON वस्तुओं को पार्स करना यूआरएल पैरामीटर के रूप में पासिंग एरेज़

कच्चे प्रकार और जेनेरिक तरीके का संयोजन

यहां एक सवाल है, यह पहला कोड प्रविष्टि अभी ठीक है (जेडीके 1.6 | जेडीके 1.7):

ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]); 

हालांकि, अगर मैं List संदर्भ को एक कच्चे प्रकार के रूप में घोषित करता हूं:

 ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]); 

मुझे एक कंपाइलर त्रुटि मिलती है जिसमें String[] की आवश्यकता होती है, लेकिन Object[] मिला था

इसका अर्थ है कि मेरा संकलक String[] को अपनी तर्क के रूप में प्राप्त करने के बावजूद Object[] लौटने के रूप में सामान्य पद्धति की व्याख्या करता है String[]

मैंने toArray(myArray) विधि हस्ताक्षर की जाँच की:

 <T> T[] toArray(T[] a); 

इसलिए यह एक पैरामीटर वाली विधि है जिसका प्रकार पैरामीटर <T> का कोई भी संबंध सूची (यानी <E> ) के साथ नहीं है

मुझे नहीं पता है कि यहां एक कच्चा प्रकार का प्रयोग करने से स्वतंत्र प्रकार पैरामीटर का उपयोग करके पैरामीटर वाली विधियों के मूल्यांकन को प्रभावित किया गया है।

  • क्या किसी को भी कोई विचार है क्यों यह कोड संकलन नहीं करता है?
  • क्या कोई किसी भी संदर्भ को जानता है जहां यह व्यवहार दस्तावेज है?

वेब के समाधान से एकत्रित समाधान "कच्चे प्रकार और जेनेरिक तरीके का संयोजन"

यह ठीक वही नहीं है जो आप चाहते हैं, लेकिन यदि आप कच्चे रूप में एक जेनेरिक क्लास का संदर्भ देते हैं, तो आप जेनेरिक का इस्तेमाल किसी भी तरह से उदाहरण के सदस्यों के लिए उपयोग करने की क्षमता खो देते हैं। यह सामान्य तरीकों तक सीमित नहीं है, ये भी देखें:

  public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); //gives unchecked warning! 

यह JLS ( 4.8 ) का प्रासंगिक हिस्सा है:

एक कन्स्ट्रक्टर (§8.8), इंस्टेंस विधि (§8.4, § 9.4), या गैर-स्टैटिक फ़ील्ड (§8.3) एम का एक कच्चा प्रकार सी, जिसका सुपरवेलैस या सुपरिनटरफेस से विरासत नहीं मिली है, वह एक कच्चा प्रकार है सी के अनुरूप सामान्य घोषणा में अपने प्रकार के विस्मरण के लिए

इस अवलोकन के व्यवहार का वर्णन करने के लिए विनिर्देश में यह सबसे निकटतम विवरण है:

एक कन्स्ट्रक्टर (§8.8), इंस्टेंस विधि (§8.8, § 9.4), या गैर-स्टैटिक फ़ील्ड (§8.3) एम का एक कच्चा प्रकार सी, जिसका सुपरवेलैस या सुपरिनटरफेस से इनहेरिट नहीं किया गया है, उसके प्रकार का विस्मरण है सी के अनुरूप सामान्य घोषणा में। एक कच्चे प्रकार सी के एक स्थिर सदस्य का प्रकार सी के समान सामान्य घोषणा में इसके प्रकार के समान है।

यह वास्तविक प्रकार पैरामीटर को एक कच्चे प्रकार के एक गैर-स्थिर प्रकार के सदस्य को पास करने के लिए एक संकलन-समय त्रुटि है जो उसके सुपर-क्लासेस या सुपरिनफ्राफेस से विरासत में नहीं मिली है।

उपर्युक्त, और मनाया व्यवहार के आधार पर, मुझे लगता है कि यह कहना सुरक्षित है कि सभी सामान्य पैरामीटर प्रकार एक कच्चे प्रकार से निकाल दिए जाते हैं। बेशक, गैर-विरासत कोड में खुद को कच्चे प्रकार के उपयोग को हतोत्साहित किया जाता है:

कच्चे प्रकारों का उपयोग केवल विरासत कोड की संगतता के लिए रियायत के रूप में अनुमति है। जावा प्रोग्रामिंग भाषा में जेनेरिटी के परिचय के बाद लिखे गए कोड में कच्चे प्रकार का प्रयोग दृढ़ता से निराश हो गया है। यह संभव है कि जावा प्रोग्रामिंग भाषा के भविष्य के संस्करण कच्चे प्रकारों के उपयोग को अस्वीकार करेंगे

जब आप जेनेरिक कंपाइलर का उपयोग नहीं करते हैं तो इसे एक कच्चा प्रकार के रूप में मानता है और इसलिए प्रत्येक सामान्य प्रकार Object बन जाता है और इसलिए आप String[] पास नहीं कर सकते क्योंकि इसे Object[] जरूरत है Object[]
तो यह सौदा है – यदि आप उपयोग करते हैं

 List l = new ArrayList<String>(); 

आप कच्चे प्रकार का उपयोग कर रहे हैं और इसके सभी उदाहरणों के सदस्यों को इसके विलोपन समकक्षों द्वारा प्रतिस्थापित किया जाता है। विशेष रूप से प्रत्येक पैरामीट्रैज्ड टाइप को एक उदाहरण विधि घोषणा में दिखाना उसके कच्चे समकक्ष के साथ बदल दिया गया है। विवरण के लिए जेएलएस 4.8 देखें

यह दिलचस्प हो सकता है कि यह व्यवहार "हल हो सकता है" दो इंटरफेस का उपयोग करें, एक बेस गैर जेनेरिक इंटरफ़ेस और एक जेनेरिक इंटरफ़ेस। फिर कंपाइलर जानता है कि बेस गैर जेनेरिक इंटरफ़ेस के सभी फ़ंक्शन सामान्य नहीं हैं और उन्हें इस तरह से व्यवहार करेंगे।

यह व्यवहार बहुत कष्टप्रद है अगर धाराओं और फ़ंक्शन चेनिंग का उपयोग करना और इसलिए मैं इसे निम्नलिखित की तरह हल करता हूं

इंटरनेशनल वारसेंस के माध्यम से Soution :

 public interface GenericInterface<X extends Y> extends BaseInterface { X getValue(); } public interface BaseInterface { String getStringValue(); } 

अब आप चेतावनी या समस्याओं के बिना निम्नलिखित कर सकते हैं:

 GenericInterface object = ...; String stringValue = object.getStringValue(); 

आपके एरेएलआईस्ट को गैर-पैरामीटेट की गई सूची के रूप में टूएरे () विधि में पारित करने वाला कोई प्रकार पैरामीटर नहीं हो सकता है, यह केवल जानता है कि यह ऑब्जेक्ट्स रखता है, यही है। a.toArray() हमेशा एक वस्तु [] सरणी लौटाएगा। फिर, आपको उसे (String[]) डालना चाहिए (इसमें सभी खतरों के साथ) यदि आप निर्दिष्ट करना चाहते हैं कि इसमें विशिष्ट स्ट्रिंग प्रकार है।