2013-01-09 35 views
16

Possible Duplicate:
Java: Instanceof and Genericsजेनेरिक के साथ उदाहरण क्यों काम नहीं करता है?

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो विशिष्ट प्रकार की सूची में एक सामान्य सूची डाली।

Cannot perform instanceof check against type parameter T. Use instead its erasure Object >instead since further generic type information will be erased at runtime.

किसी भी स्पष्टीकरण या जिस तरह से वांछित परिणाम प्राप्त करने के लिए - एक संकलन त्रुटि दिखा नीचे

public <T>List<T> castCollection(List srcList, Class<T> clas){ 
    List<T> list =new ArrayList<T>(); 
    for (Object obj : srcList) { 
     if(obj instanceof T){ 
      ... 
     } 
    } 
    return list; 
} 

लेकिन obj instanceof T कोड का पता लगाएं?

अग्रिम धन्यवाद। :)

+1

.. क्योंकि आपने खोज नहीं की (-1); '[जावा] जेनेरिक उदाहरण' http://stackoverflow.com/questions/1570073/java-instanceof-and- जेनरिक्स, http://stackoverflow.com/questions/13768049/use-instanceof-in-a-generic- रास्ता, http://stackoverflow.com/questions/8741984/why-t-instanceof-t-is-not-allowed-where-t-is-a-type-parameter-and-t-is-a-varia? lq = 1, http://stackoverflow.com/questions/4397660/generics-and-instanceof-java?rq=1 (आदि) –

उत्तर

33

आप इसे इस तरह से नहीं कर सकते हैं। सौभाग्य से, आप पहले से ही एक Class<T> तर्क तो बजाय करना

myClass.isAssignableFrom(obj.getClass()) 

यह सच वापस आ जाएगी अगर obj वर्ग myClass या उपवर्ग की है।

@ILMTitan ने बताया (धन्यवाद), आपको संभावित NullPointerException से बचने के लिए obj == null की जांच करने की आवश्यकता होगी, या इसके बजाय myClass.isInstance(obj) का उपयोग करें। या तो आपको क्या चाहिए।

+5

जो ओबीजे का शून्य सूचक हो सकता है 'शून्य' है। 'InInstance() 'शून्य सूचक समस्या का कारण नहीं बनता है। – ILMTitan

2

जेनेरिक प्रकार संकलन के बाद erased होगा (जेनेरिक संकलन समय प्रकार सुरक्षा के लिए हैं) और संकलन के बाद सबसे अधिक लागू प्रकार के साथ प्रतिस्थापित किया जाएगा।

आप इस संकलन बनाने, ठोस प्रकार के साथ टी की जगह चाहते हैं, उदाहरण के

obj instance String 
4

T एक पैरामिट्रीकृत प्रकार है और संकलन प्रयोजनों के लिए मौजूद है। यह टाइप एरर के कारण रनटाइम पर मौजूद नहीं है।

इसलिए, obj instanceof T कानूनी नहीं है।

4

क्योंकि जावा मिटाने का उपयोग करता है, सामान्य प्रकारों को जांचने के लिए उपयोग नहीं किया जा सकता है।

वांछित परिणाम प्राप्त करने के लिए, Class.isInstance() का उपयोग करें।

7

संक्षिप्त उत्तर: क्योंकि जावा में एक प्रकार पैरामीटर कुछ प्रकार की सुरक्षा प्रदान करने के लिए कंपाइलर द्वारा उपयोग किया जाता है।

रनटाइम पर, जेनेरिक प्रकारों के बारे में जानकारी टाइप एरर के कारण छोड़ दी जाती है लेकिन instanceof एक रनटाइम चेक है जिसे काम करने के लिए एक ठोस प्रकार (एक प्रकार परिवर्तनीय नहीं) की आवश्यकता होती है।

+0

क्या संकलन समय पर जांच के लिए कोई 'exampleof' एनालॉग है? मेरे मामले में, मैं 'Queue' की' add' विधि की मेरी परिभाषा के हिस्से के रूप में 'ClassCastException' को फेंकने की कोशिश कर रहा हूं। मेरा पहला विचार 'exampleof' था लेकिन मुझे' त्रुटि मिली: उदाहरण के लिए अवैध जेनेरिक प्रकार 'संकलन के दौरान। – Ungeheuer

+0

@Ugegeheuer आपको अपने प्रकार परिवर्तनीय को बाध्य करना चाहिए। – Jack