संभावित डुप्लिकेट:
जावा: इंस्टेंसोफ़ और जेनरिक
मैं एक फ़ंक्शन लिखने की कोशिश कर रहा हूं जो विशिष्ट प्रकार की सूची के लिए एक सामान्य सूची कास्ट करता है। नीचे दिए गए कोड का पता लगाएं
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 के लिए 35आप यह काम इस तरह से नहीं कर सकते हैं। सौभाग्य से, आप पहले से ही एक है Class<T>
इसके बजाय तर्क है
myClass.isAssignableFrom(obj.getClass())
यह सच हो जाएगा अगर obj
कक्षा का है myClass
या उपवर्ग।
जैसा कि @ILMTitan ने बताया (धन्यवाद), आपको इसकी जांच करनी होगी obj == null
संभावित NullPointerException से बचने के लिए, या उपयोग करें myClass.isInstance(obj)
बजाय। या तो आपको क्या चाहिए।
उत्तर के लिए 7 № 2
संक्षिप्त उत्तर: क्योंकि टाइप सुरक्षा प्रदान करने के लिए कंपाइलर द्वारा जावा में टाइप पैरामीटर का उपयोग किया जाता है।
रनटाइम के समय, जेनेरिक प्रकारों के बारे में जानकारी टाइप के कारण मिटा दी जाती है लेकिन instanceof
रनटाइम चेक है जिसे काम करने के लिए एक ठोस प्रकार (नहीं एक प्रकार का चर) की आवश्यकता होती है।
जवाब के लिए 4 № 3
T
एक मानकीकृत प्रकार है और संकलन प्रयोजनों के लिए मौजूद है। यह प्रकार के क्षरण के कारण रनटाइम पर मौजूद नहीं है।
इसलिए, obj instanceof T
कानूनी नहीं है।
जवाब के लिए 4 № 4
क्योंकि जावा erasure का उपयोग करता है, जेनेरिक प्रकारों का उपयोग जांच के लिए नहीं किया जा सकता है।
वांछित परिणाम प्राप्त करने के लिए, का उपयोग करें Class.isInstance()
.
जवाब के लिए 2 № 5
जेनेरिक प्रकार होंगे मिट संकलन के बाद (जेनेरिक संकलन समय सुरक्षा के लिए हैं) और संकलन के बाद सबसे लागू प्रकार के साथ प्रतिस्थापित किया जाएगा।
यदि आप यह संकलन करना चाहते हैं, तो T को ठोस प्रकार से बदलें, उदाहरण के लिए
obj instance String