दिलचस्प पोस्ट
PHP कर्ल के साथ दूरस्थ साइट पर लॉग इन करें हैश कोड क्या है? क्या यह अद्वितीय है? मैं कैसे पता लगा सकता है कि किस DOM तत्व का ध्यान केंद्रित है? एचटीएमएल / पीएचपी – फॉर्म – इनपुट सरणी के रूप में एंड्रॉइड पर यूआरएल से छवि कैसे प्रदर्शित करें पायथन में इंटरलीविंग सूचियां जावा में एंड्रॉइड एनीमेशन फीका आउट करें पायथन में पुनरावर्ती की मूल बातें यूआईएलबल में पाठ की कई पंक्तियाँ SQL सर्वर – संग्रहित प्रक्रिया से चुनें एक टंकिनर विंडो बंद करें? कक्षा परिभाषा में स्थिर कॉन्स्ट पूर्णांक सदस्यों को परिभाषित करना क्या मैं == 0 और 0 == में अंतर है I? कैसे रद्द करें / रोकें jQuery के AJAX अनुरोध? त्रुटि के फेंकने की गतिविधि के अंदर एक टुकड़ा के TextView क्यों पहुंच रहा है

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

यहां एक सवाल है, यह पहला कोड प्रविष्टि अभी ठीक है (जेडीके 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[]) डालना चाहिए (इसमें सभी खतरों के साथ) यदि आप निर्दिष्ट करना चाहते हैं कि इसमें विशिष्ट स्ट्रिंग प्रकार है।