2013-05-21 28 views
14

मैं जावा ऑब्जेक्ट सरणी बनाने का प्रयास कर रहा हूं और सरणी को अपने दूसरे इंडेक्स (सरणी के साथ एक स्व-समान फ्रैक्टल का प्रतिनिधित्व करने के लिए) में रखता हूं, लेकिन जब मैं theArray[1][1][0] तक पहुंचने का प्रयास करता हूं, तो मुझे यह त्रुटि मिलती है:मैं जावा सरणी को अपने अंदर कैसे रख सकता हूं?

Main.java:11: error: array required, but Object found

यह वही है मैं अब तक की कोशिश की है है, और मुझे यकीन है कि क्यों यह काम नहीं कर रहा नहीं कर रहा हूँ:,

import java.util.*; 
import java.lang.*; 

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Object[] theArray = new Object[2]; 
     theArray[0] = "This array should contain itself at its second index."; 
     theArray[1] = theArray; //Now I'm attempting to put the array into itself. 
     System.out.println(theArray[1][1][0]) //Main.java:11: error: array required, but Object found 
    } 
} 

यह वास्तव में ही अंदर एक जावा सरणी डाल करने के लिए संभव है के रूप में मैं करने के लिए प्रयास कर रहा हूँ यहाँ करो

+0

सुझाव: के बारे में पढ़ें जावा 'exampleof' ऑपरेटर। आपको इसकी आवश्यकता होगी –

+0

आप '(ऑब्जेक्ट []) (ऑब्जेक्ट []) का उपयोग कर सकते हैं [1]) [1]) [0] ':) –

+0

@ Eng.Fouad जो मुझे कुछ परेशानियों की याद दिलाता है मैंने देखा है कि सब कुछ ध्वस्त हो गया है 'ऑब्जेक्ट []' उदाहरणों में, जिसके परिणामस्वरूप जंगली श्रृंखलाएं होती हैं; यह निश्चित रूप से पहली नजर में थोड़ा अस्पष्ट है। – Vulcan

उत्तर

19

theArray[1]संकलन समय प्रकार Object (क्योंकि यह वस्तुओं की एक सरणी से आता है) की है।

इसे इसे एक सरणी के रूप में उपयोग करने के लिए Object[] पर डालना होगा।


बुनियादी समस्या आप का सामना कर रहे है कि हालांकि एक सरणी है जो अपने आप में शामिल है एक पूरी तरह से वैध वस्तु है, यह एक वैध प्रकार नहीं है।

आप घोंसला प्रकारों को मनमाने ढंग से गहराई से – Object[][][][][][][][][][][][][] मान्य प्रकार बना सकते हैं।
हालांकि, प्रकार का "नीचे स्तर" एक सरणी नहीं हो सकता है।

आप एक प्रकार का निर्माण करने की कोशिश कर रहे हैं जो स्वयं की एक सरणी है।
जेनरिक का उपयोग करना, यह संभव होगा:

class Evil extends ArrayList<Evil> { } 
+0

दाएं। आपके 'ऑब्जेक्ट []' सरणी का एक तत्व कंपाइलर के लिए है, बस एक 'ऑब्जेक्ट'। इसे 'ऑब्जेक्ट [])' कास्ट ऑपरेशन का उपयोग करके 'ऑब्जेक्ट []' पर डाला जाना चाहिए। यह संकलक को रनटाइम चेक उत्पन्न करने का कारण बनता है ताकि यह सुनिश्चित किया जा सके कि यह वास्तव में एक 'ऑब्जेक्ट []' है जैसा आप कहते हैं। –

+0

@ हॉटिक्स: असल में, रनटाइम चेक जेआईटर से आता है, मुझे विश्वास है। – SLaks

+0

'System.out.println ((ऑब्जेक्ट []) (theArray [1]) [1] [0]); 'एक ही त्रुटि उत्पन्न करने लगता है। –

2

चूंकि आप theArray घोषित कर दिया है ऑब्जेक्ट की श्रृंखला होने के लिए एक कास्टिंग त्रुटि में चला रहे हैं। नतीजतन, आप जावा का वादा नहीं कर सकते कि theArray[1]Array है - यह किसी भी प्रकार का Object हो सकता है। आप आप क्या चाहते करने के लिए आपकी पहुँच को तोड़ने के लिए की आवश्यकता होगी:

Object[] innerArray = (Object[]) theArray[1]; 
System.out.println(innerArray[0] == theArray[0]); // Always true since innerArray IS theArray 
while (true) { 
    // Careful! This loops forever! 
    // set innerArray = innerArray[1] = theArray = theArray[1] = innerArray... 
    // all of these are the exact same object (but you have to tell Java their type every time) 
    innerArray = (Object[]) innerArray[1]; 
    System.out.println(innerArray[0]); 
} 
+0

बीटीडब्लू, जो कभी नहीं (AFAIK?) दुर्घटनाग्रस्त होगा। – SLaks

+0

यह वही सरणी है; यह कभी खत्म नहीं होगा। और यह स्मृति या ढेर को रिसाव नहीं करेगा, या तो। – SLaks

+0

@SLaks यह क्यों नहीं निकलता? प्रत्येक पुनरावृत्ति 'आंतरिक आरे' को अपने दूसरे तत्व को इंगित करने के लिए सेट करता है ... जब तक मैंने ध्यान दिए बिना कुछ बेवकूफ किया हो? –

1

आपका कोड

Object arr = theArray[1]; // arr is an Object here, not an array 

के बराबर है लेकिन तुम कर सकते हो

Object[] arr = (Object[]) theArray[1]; // Now it is an array 
संबंधित मुद्दे

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