2013-02-03 25 views
5

का उदाहरण है, तो मेरे पास Object है जिसमें कभी-कभी List<Object> होता है। मैं इसे instanceof के साथ जांचना चाहता हूं, और यदि ऐसा है, तो इसमें कुछ तत्व जोड़ें।यदि ऑब्जेक्ट सूची <Object>

void add(Object toAdd) { 
    Object obj = getValue(); 
    if (obj instanceof List<?>) { 
     List<?> list = obj; 
     if (list instanceof List<Object>) { // Error 
      ((List<Object>) list).add(toAdd); 
     } else { 
      List<Object> newList = new ArrayList<Object>(list); 
      newList.add(toAdd); 
      setValue(newList); 
     } 
     return; 
    } 
    throw new SomeException(); 
} 

और यह अगर यह instanceof List<Object> है क्योंकि जावा परवाह नहीं करता और <> में टाइप मिट मैं जांच नहीं कर सकता कहते हैं। क्या इसका मतलब है कि मुझे हर बार नई ऐरेलिस्ट बनाना है? या यह जांचने का कोई तरीका है, उदाहरण के लिए। प्रतिबिंब के साथ?

+2

कोड का यह टुकड़ा क्या है? – poitroae

+2

इसे जावा में टाइप एरर के रूप में जाना जाता है http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens –

+0

@ माइकल यह सांप्यामल के चारों ओर एक रैपर होने जा रहा है। अगर मेरे पास yaml की एक सूची है, तो यह जावा में कुछ सूची में इसका विश्लेषण करेगी। अगर मैं इस सूची में कोई तत्व जोड़ना चाहता हूं, तो मुझे यह जानना होगा कि यह किस प्रकार की सूची है। यही कारण है कि मैं ज्ञात प्रकार का एक नया ऐरेलिस्ट बनाता हूं और इसमें सभी पुराने तत्व जोड़ता हूं, साथ ही एक नया। फिर मैं पुरानी सूची को नए से बदलता हूं, और जब मैं इसे सांप्यामल को यमल में बदलने के लिए कहता हूं, तो मेरा जोड़ा तत्व वहां होगा। – Wolf480pl

उत्तर

3

मैं अपने पिछले उत्तर में गलत था क्योंकि मैं आपकी आवश्यकताओं को पूरी तरह से समझ नहीं पाया था। यदि आपका जोड़ा गया आइटम एक ऑब्जेक्ट है तो आप इसे किसी भी समस्या के बिना जोड़ सकते हैं जब तक कि आपके पास कुछ की सूची न हो। आप पुनः सूची नहीं है

void add(Object toAdd) { 
    Object obj = getObject(); 
    if (obj instanceof List<?>) { 
     ((List<Object>)obj).add(toAdd); 
     return; 
    } 
    throw new SomeException(); 
} 

अद्यतन

कुछ टिप्पणी करने के लिए जवाब के रूप में, वहाँ एक सूची में किसी भी वस्तु को जोड़ने के लिए कोई समस्या नहीं है, और वहाँ पता लगाने के लिए कोई समस्या नहीं है इसके बाद पुनरावृत्ति के दौरान यह किस प्रकार की वस्तु है:

List<String> x1 = new ArrayList<String>(); 
Object c3 = x1; 
x1.add("asdsad"); 
Integer y2 = new Integer(5); 
if (c3 instanceof List<?>){ 
    ((List<Object>)c3).add((Object)y2); 
} 

for (Object i : (List<Object>)c3){ 
    if (i instanceof String){ 
     System.out.println("String: " + (String)i); 
    } 
    if (i instanceof Integer){ 
     System.out.println("Integer: "+ (Integer)i); 
    } 
} 
+0

मैं यह सुनिश्चित करना चाहता हूं कि पैरामीटर ऑब्जेक्ट का उप-वर्ग नहीं है। प्राप्त होगा AtctTypeArguments() == ऑब्जेक्ट.क्लास काम? – Wolf480pl

+0

इसके अलावा, क्या यह <50 तत्व ArrayList की प्रतिलिपि बनाने से तेज़ होगा? – Wolf480pl

+1

यह पूरी तरह से गलत है। यह केवल तभी होता है जब ऑब्जेक्ट की कक्षा ArrayList या कुछ का उप-वर्ग है, और जो इसे एक विशिष्ट प्रकार पैरामीटर के साथ विस्तारित करती है। इनमें से कोई भी ओपी क्या कर रहा है। – newacct