समस्या का सारांश: मैं (जैसे ArrayList<SomeClass>
के रूप में उदाहरण के लिए) एक प्रकार पैरामीटर के साथ एक कक्षा पास करने के लिए चाहते हैं एक प्रकार पैरामीटर के रूप में एक सामान्य विधि के लिए ।एक वर्ग जावा में सामान्य विधि के लिए प्रकार पैरामीटर के रूप में प्रकार पैरामीटर के साथ पासिंग
चलो कहते हैं कि मैं एक विधि है दो:
public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){
// details unimportant, basically returns an object of specified type
return JsonParser.fromJson(json, genericType);
}
इस विधि, ज़ाहिर है, वर्ग के किसी भी प्रकार के लिए बिल्कुल ठीक काम करेंगे। मैं उदाहरण के लिए, तो जैसे विधि कॉल कर सकते हैं:
getGenericObjectFromJson(jsonString, User.class)
समस्या: मुझे लगता है मैं ऐसा नहीं कर सकते पता चला:
getGenericObjectFromJson(jsonString, ArrayList<User>.class)
वाक्य रचना, इस स्पष्ट रूप से अवैध है। हालांकि, मुझे यकीन नहीं है कि मैं इस तरह कुछ कैसे पूरा करूंगा। मैं, निश्चित रूप से, ArrayList.class
पास कर सकता हूं, हालांकि सामान्य प्रकार के अतिरिक्त इसे अब वाक्य रचनात्मक रूप से वैध नहीं बनाता है, और मैं इसके चारों ओर एक तरीके से नहीं सोच सकता।
केवल प्रत्यक्ष समाधान कुछ इस तरह (जो बल्कि नासमझ लगती है) कर दिया गया है:
getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass())
लेकिन हम अंत में सामान्य प्रकार वैसे भी खोने, और केवल वापस (हालांकि यह कर सकते हैं अज्ञात प्रकार की एक ArrayList मिल कास्ट किया जा सकता है)। इसके अलावा, अनावश्यक रूप से किसी ऑब्जेक्ट को तुरंत चालू करना।
मेरे एकमात्र समाधान अब तक एक वर्ग है कि एक सामान्य प्रकार पैरामीटर जो, instantiated जा सकता है ताकि तरह होता है में है कि विधि रैप करने के लिए कर दिया गया है:
public class JsonDeserializer<T>...
इस मामले में, getGenericObjectFromJson
विधि वर्ग के उपयोग करेगा सामान्य प्रकार
प्रश्न (ओं): आखिरकार, मैं उत्सुक हूं कि मैं एक प्रकार के पैरामीटर के साथ कक्षा क्यों नहीं पारित कर सकता हूं, और क्या मैंने जो करने का प्रयास किया है उसे पूरा करने का कोई तरीका है या नहीं।
हमेशा के रूप में, मुझे इस प्रश्न के साथ कोई समस्या होने पर बताएं।
मिटाए जाने के कारण, मुझे नहीं लगता कि यह संभव है। जावा जेनेरिक एक संकलन-समय का निर्माण होता है और रनटाइम पर मौजूद नहीं होता है, इसलिए ऐसी कोई चीज नहीं है जो 'क्लास' ऑब्जेक्ट को निर्मित जेनेरिक प्रकार का प्रतिनिधित्व करती है। – cdhowie
समाधान: 'सी #', न सिर्फ मजाक कर रहा है। आप "टाइप एरर" के कारण ऐसा नहीं कर सकते हैं, जेनेरिक टाइप जानकारी –
को हटाकर जब आप संकलित करते हैं तो जावा क्या करता है, क्या यह इसे 'getGenericArrayListFromJson (jsonString, User.class)' के रूप में पुन: संपादित करने के लिए काम करेगा? यह शायद सबसे अच्छा है जिसे आप करने में सक्षम होने जा रहे हैं। –