2010-10-05 18 views
21

मुझे जेनेरिक ऐरे निर्माण की त्रुटि को समझ में नहीं आता है।
त्रुटि: सामान्य ऐरे निर्माण

public PCB[] getAll() { 
     PCB[] res = new PCB[list.size()]; 
      for (int i = 0; i < res.length; i++) { 
       res[i] = list.get(i); 
      } 
     list.clear(); 
     return res; 
} 


तो मैं ऐसा करने की कोशिश की:

PCB[] res = new PCB[100]; 


मुझे याद आ जाना चाहिए कुछ कारण यह है कि सही लगता है
सबसे पहले मैं निम्नलिखित की कोशिश की। मैंने इसे देखने की कोशिश की मैंने वास्तव में किया। और कुछ भी क्लिक नहीं कर रहा है।


मेरा प्रश्न है: मैं इसे ठीक करने के लिए क्या कर सकता हूं?


त्रुटि है:

.\Queue.java:26: generic array creation 
PCB[] res = new PCB[200]; 
      ^
Note: U:\Senior Year\CS451- file  
uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
1 error 

उपकरण बाहर निकलने के कोड के साथ पूरा 1

+0

आप पोस्ट कर सकते हैं अपवाद/त्रुटि –

+1

मैं यह सोचते हैं कि 'PCB' एक सामान्य प्रकार पैरामीटर है और इस तरह, तुम क्या कर रहे प्रकार विलोपन की वजह से जावा में असंभव है। यदि यह सब सच है, आप इस लिंक मैं इस रूप में यह एक समाधान प्रदान करता है के एक dup चिह्नित पर क्लिक करना चाहिए। –

+0

पहले से ही उस पोस्ट को पढ़ने की कोशिश कर रहा है। यह मुझे मदद नहीं करता है – Luron

उत्तर

29

आप एक सामान्य घटक प्रकार के साथ सरणियों नहीं बना सकते।

इसके बजाय Object[] जैसे किसी स्पष्ट प्रकार की सरणी बनाएं। यदि आप चाहें तो इसे PCB[] पर डालें, लेकिन अधिकांश मामलों में मैं इसकी अनुशंसा नहीं करता हूं।

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */ 

आप प्रकार सुरक्षा चाहते हैं, एक सरणी के बजाय java.util.List<PCB> की तरह एक संग्रह का उपयोग करें।

वैसे, यदि list पहले से ही java.util.List है, तो आपको अपने कोड में डुप्लिकेट करने की बजाय toArray() विधियों में से एक का उपयोग करना चाहिए। हालांकि यह आपके आसपास की सुरक्षा-सुरक्षा समस्या के आसपास नहीं मिलता है।

+2

हाँ, लेकिन जब आप इसे बाहर भेजते हैं, और कॉलर इसे पीसीबी [] के चर के रूप में निर्दिष्ट करता है। बूम आपको क्लास कास्ट अपवाद मिलेगा – newacct

+0

@ न्यूवाक्ट - यह आवश्यक नहीं होगा। यह कॉलिंग संदर्भ पर निर्भर करता है। लेकिन ऐसा हो सकता है। मेरा मतलब है कि "टाइप टाइप-सुरक्षित नहीं" और मैंने इसके खिलाफ क्यों अनुशंसा की। – erickson

+1

@ एरिक्सन: अंततः यह कुछ बिंदु पर होगा क्योंकि रिकर्सन सामने आता है। जेनेरिक हमेशा किसी बिंदु पर ठोस बन जाते हैं या नहीं तो कोई काम कभी नहीं किया जाएगा। इसका एकमात्र तरीका यह उचित रूप से काम करेगा यदि परिणाम वास्तव में वास्तविक प्रकार के 'पीसीबी' की सरणी के रूप में उपयोग नहीं किया जाता है। इस मामले में खुद को 'ऑब्जेक्ट []' लौटने के रूप में घोषित करने के लिए बेहतर है। –

2

"संभावित डुप्लिकेट" में सुझाए गए तरीके के अलावा, इस समस्या को हल करने का दूसरा मुख्य तरीका कॉलर द्वारा आपूर्ति की जाने वाली सरणी (या कम से कम एक टेम्पलेट) के लिए है, जो उम्मीदपूर्वक जान लेंगे ठोस प्रकार और इस प्रकार सुरक्षित रूप से सरणी बना सकते हैं।

इस तरह से तरीके ArrayList.toArray(T[]) लागू किए गए हैं। मेरा सुझाव है कि आप प्रेरणा के लिए उस विधि को देखें। बेहतर अभी तक, आपको शायद उस विधि का उपयोग करना चाहिए जैसा कि अन्य ने नोट किया है।

2

निम्नलिखित आप प्रकार, जबकि प्रकार सुरक्षा संरक्षण आप चाहते हैं की एक सरणी दे देंगे।

PCB[] getAll(Class<PCB[]> arrayType) { 
    PCB[] res = arrayType.cast(java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size())); 
    for (int i = 0; i < res.length; i++) { 
     res[i] = list.get(i); 
    } 
    list.clear(); 
    return res; 
} 

इस कैसे काम करता है सवाल है कि किर्क Woll डुप्लीकेट के रूप में जुड़े my answer में गहराई से समझाया गया है।

संबंधित मुद्दे