2012-05-20 15 views
5

से त्रुटि, मैं जेनेरिक का उपयोग करके एक लिंक किए गए संग्रह को लागू करने की कोशिश कर रहा हूं, कुछ निम्न की तरह।जेनरिक ऐरे क्रिएशन संकलन आंतरिक कक्षा

public class A<E> { 

    private class B { 

    private B[] b; 
    private E item; 

    private B() { 
     this.b = new B[2]; 
    } 

    } // end inner class B 

} // end class A 

एक संग्रह और बी एक सरणी संदर्भित उत्तराधिकारियों/पूर्ववर्तियों और एक आइटम के साथ एक तत्व या संग्रह में नोड है।

सरणी निर्माण की अनुमति नहीं है। मुझे मिली त्रुटि generic array creation है। क्या मुझे यह सोचने का अधिकार है कि यह वास्तव में क्या बना रहा है A<E>.B की एक सरणी है?

यदि नहीं, तो त्रुटि क्या हो रही है?

यदि हां, तो मैं इसके आसपास कैसे हो सकता हूं?

मैंने स्पष्ट रूप से कोड की एक बड़ी राशि छोड़ी है, अगर मैंने जो प्रदान किया है वह पर्याप्त नहीं है तो कृपया मुझे बताएं। किसी भी सलाह की सराहना की जाएगी। धन्यवाद।

संपादित करें 1: मैंने कहा जाना चाहिए था कि पैरामिट्रीकृत प्रकार B में के रूप में A में ही होना चाहिए। तो आंतरिक कक्षा में <E> गुजरना संभव नहीं है, क्योंकि यह E#2 बनाता है और E#1 के साथ छोड़ देता है।

+0

नहीं विशेष रूप से अपने प्रश्न का उत्तर है, लेकिन यह दो चर 'के लिए बेहतर डिजाइन किया जाएगा पूर्ववर्ती 'और' उत्तराधिकारी 'प्रकार बी के बजाय दो तत्वों की सरणी के बजाय। आपकी कक्षा को पढ़ने में आसान बना देगा। मुझे लगता है कि यह आपकी समस्या को दूर कर देगा? –

+0

डब्लूआरटी संपादित 1, 'स्थिर वर्ग बी ' आज़माएं और आपके पास नामकरण समस्या नहीं होगी। सरणी अभी भी काम नहीं करेगी, हालांकि, यह जेनेरिक है। –

+0

आप सरणी के बजाय जेनेरिक संग्रह का उपयोग कर इसके आसपास भी हो सकते हैं। – trutheality

उत्तर

4

आप फोन B बाहरी वर्ग से सामान्य विरासत की जरूरत है। और आप इसे स्थिर नहीं बना सकते हैं, क्योंकि इसके बाद E भी इसकी आवश्यकता होगी।

तो अपने B.b सरणी वास्तव में एक प्रकार है कि सामान्य है, यानि कि A<E>.B की आवश्यकता होगी या यदि आप एक स्थिर भीतरी कक्षा में अपने कोड को बदल देंगे, A.B<E> (आप private static class B<E> का प्रयोग करेंगे तो)।

जावा में, जिस तरह जेनरिक लागू होते हैं (मिटाकर), सरणी का प्रकार अच्छी तरह परिभाषित नहीं है। दूसरी तरफ, यह B की सरणी होनी चाहिए, दूसरी तरफ, यह Object की सरणी होनी चाहिए।

सबसे व्यावहारिक समाधान Object[] का उपयोग करना और स्पष्ट रूप से डालना प्रतीत होता है। यदि आप बढ़ी हुई प्रकार की सुरक्षा चाहते हैं, तो आप निश्चित रूप से ArrayList<B> का उपयोग कर सकते हैं, जो आंतरिक रूप से Object[] का भी उपयोग करता है!

आपके विशेष कोड में, B b1, b2; एक विकल्प भी हो सकता है जो वास्तव में तेज़ है (कोई सीमा जांच नहीं है) और कम स्मृति की आवश्यकता है (कोई सरणी वस्तु नहीं; कोई आकार की जानकारी नहीं है)।

+0

मैंने अलग बी 1, बी 2 संदर्भों का उपयोग करने के बारे में सोचा था। ऐसा लगता है कि यह जाने का सबसे उपयुक्त तरीका है। यह कुछ तरीकों से संग्रह के अधिक जटिल ट्रैवर्सल बनाता है। आपकी प्रतिक्रिया के लिए धन्यवाद, बहुत उपयोगी। – comfortablejohn

-2

आप, के रूप में यह स्थिर नहीं है आंतरिक वर्ग के लिए ई पारित करने के लिए और साथ ही

private class B<E> { 

      private B[] b; 
      private E item; 

      private B() { 
       this.b = new B[2]; 
      } 

     } // end inner class B 
+2

क्या वह वही त्रुटि नहीं देगा? –

+0

हां। और मेरे संपादन के अनुसार, मुझे बाहरी और आंतरिक दोनों वर्गों में प्रकारों की आवश्यकता होती है। उपर्युक्त करने का अर्थ यह होगा कि हालांकि वे दोनों एक ही प्रकार में बदल सकते हैं, कहें कि 'ए ' उन्हें दोनों इंटीग्रर्स बनाता है, दोनों के बीच संदर्भ के दौरान तुलनात्मक या संगत नहीं होते हैं। – comfortablejohn

+0

क्षमा करें, मुझे कोई लाभ नहीं दिख रहा है। आपके सेटअप में, यह नाम ओवरलोडिंग प्राप्त करने के लिए IMHO वास्तव में 'निजी स्थैतिक कक्षा बी ' होना चाहिए, और यह अभी भी 'नई बी [2]' सरणी निर्माण की अनुमति नहीं देगा। –

2

B एक गैर स्थैतिक आंतरिक वर्ग है। इसका मतलब है कि इसमें संलग्न वर्ग के एक उदाहरण का संदर्भ है। तो यह बाहरी वर्ग के प्रकार पैरामीटर द्वारा पूरी तरह से पैरामीटर किया गया है। तो जब आप B लिखते हैं, तो इसका अर्थ है A<E>.B। एक सरणी बनाने के लिए, आपको कच्चे वर्ग का उपयोग करना चाहिए।हालांकि, B कच्ची कक्षा नहीं है; कच्चे वर्ग आप स्पष्ट रूप से यह अर्हता प्राप्त करने की आवश्यकता का उल्लेख करने के: A.B

तो यह है कि आप चाहते हैं:

this.b = new A.B[2]; 
संबंधित मुद्दे