2017-02-06 21 views
5

मुझे एक जावा विधि लिखनी है जो कक्षा (ऑब्जेक्ट नहीं) लेती है और फिर सरणी में प्रत्येक सदस्य के तत्व के रूप में उस वर्ग के साथ एक ऐरेलिस्ट बनाता है। छद्म कोड उदाहरण:पास क्लास प्रकार ArrayList में उपयोग करने के लिए पैरामीटर के रूप में?

public void insertData(String className, String fileName) { 
     ArrayList<className> newList = new ArrayList<className>(); 
} 

मैं इसे जावा में कैसे पूरा कर सकता हूं?

+4

यह 'स्ट्रिंग className' होने के लिए है? यदि आप वास्तविक 'क्लास' ऑब्जेक्ट को 'insertData (exampleClass.class, fileName)' में पारित कर सकते हैं तो यह आसान होगा। – nickb

+0

मुझे नहीं पता कि मैं किस कक्षा में गुजर रहा हूं। – Greymarch

उत्तर

4

आप Generic methods

public <T> void insertData(Class<T> clazz, String fileName) { 
    List<T> newList = new ArrayList<>(); 
} 

उपयोग कर सकते हैं, लेकिन अगर आप इस अनुबंध insertData(String className, String fileName) का उपयोग करना चाहिए, आप जेनरिक उपयोग नहीं कर सकते क्योंकि सूची आइटम के प्रकार के जावा द्वारा संकलन समय में हल नहीं किया जा सकता है।

इस मामले तुम सब पर जेनरिक का उपयोग कर सकते नहीं करते हैं और प्रतिबिंब का उपयोग प्रकार की जांच करने के लिए इससे पहले कि आप सूची में डाल दिया है:

public void insertData(String className, String fileName) { 
    List newList = new ArrayList(); 

    Class clazz; 
    try { 
     clazz = Class.forName(className); 
    } catch (ClassNotFoundException e) { 
     throw new RuntimeException(e); // provide proper handling of ClassNotFoundException 
    } 

    Object a1 = getSomeObjectFromSomewhere(); 

    if (clazz.isInstance(a1)) { 
     newList.add(a1); 
    } 
    // some additional code 
} 

लेकिन वर्ग की जानकारी के बिना आप कर रहे हैं सक्षम उपयोग सिर्फ Object क्योंकि आप अपने ऑब्जेक्ट में अज्ञात क्लास पर अपनी ऑब्जेक्ट नहीं डाली जा सकती है।

+0

ध्यान दें कि यह ओपी के विधि हस्ताक्षर को बदलता है, जो वांछित हो सकता है या नहीं भी हो सकता है। – nickb

+0

@nickb सहमत हैं, उत्तर –

+0

@VladBochenin क्या आप उपर्युक्त कोड का कार्यान्वयन उदाहरण प्रदान कर सकते हैं? – Greymarch

2

व्लाद बोचेनिन एक अच्छा तरीका देता है लेकिन यह आपकी जेनरेट करने के लिए कोई समझ नहीं आता है जो आपकी विधि में कुछ भी नहीं मिलता है।
यह insertData() के कोड में शून्य बाधा डालता है जो सूची में हेरफेर करता है।
आपको कोड में डालने के लिए मजबूर होना होगा और यह जेनेरिक के उद्देश्य को हरा देता है।

मुझे लगता है कि आप insertData() में ज्ञात कक्षाओं के कुछ उदाहरणों में हेरफेर करना चाहते हैं।
और यदि आप अपने मामले में जेनेरिक का उपयोग करते हैं, तो यदि आपके पास कक्षाओं के उपप्रकारों का उपयोग करने के लिए उपप्रकार हैं तो यह अधिक अर्थपूर्ण होगा।

इस तरह, आपके पास एक ऐसी विधि हो सकती है जो आधार प्रकार और इसके उप-वर्गों को स्वीकार करे।

public static <T extends YourClass> void insertData(Class<T> clazz, String fileName) { 
    List<T> newList = new ArrayList<>(); 
    T t = newList.get(0); 
    // here I can manipulate something that derives from YourClass 
} 
+0

@Downvoter क्या आप समझा सकते हैं? आमतौर पर मुझे लगता है कि नहीं। – davidxxx

+0

मैं डाउनवॉटर नहीं हूं, लेकिन आपका दावा है कि "टी विधि जेनरेट करने के लिए कोई समझ नहीं है जो आपकी विधि में कुछ भी नहीं है" गलत है।निश्चित रूप से, जब तक आप प्रतिबिंब का सहारा लेते हैं, तब तक आप सूची में आइटमों में से किसी भी विधि को कॉल नहीं कर सकते हैं, लेकिन आप 'सूची ' (शायद दिए गए नाम से फ़ाइल से deserialized मूल्यों के साथ) को पॉप्युलेट कर सकते हैं। आमतौर पर आप उस सूची को वापस करना चाहते हैं, हालांकि। कॉलसाइट पर, आप संकलन समय पर 'टी' जानते हैं और अपनी पसंद की किसी भी विधि को कॉल कर सकते हैं। – Hulk

+1

@ हल्क प्रश्न में यह सूची वापस नहीं करता है। यदि ऐसा होता है, वास्तव में, यह समझ में आता है। "आप एक सूची (शायद दिए गए नाम के साथ फाइल से deserialized मूल्यों के साथ) बना सकते हैं।" यह अभी भी जेनेरिक के उद्देश्य को हरा देता है क्योंकि आप 'ऑब्जेक्ट' की सूची में किसी फ़ाइल से पुनर्प्राप्त कुछ उदाहरण डाल देंगे। टी कुछ भी नहीं, परिणामस्वरूप केवल 'ऑब्जेक्ट' से निकला है। यहां जेनिक्स का क्या फायदा है? इस मामले में, हम कक्षा पैरामीटर को हटाने और insertData() विधि में '@ SuppressWarnings' जोड़ने के लिए एपीआई को सरल बना सकते हैं, अंततः जेनरिक यहां कोई सुरक्षा नहीं लाता है। – davidxxx

0

मेरा अनुमान है कि आप वास्तव में क्या करना चाहते हैं उत्पन्न List वापस जाने के लिए है। यह है कि कैसी दिखाई दे सकती है:

public <T> List<T> loadData(Class<T> clazz, String fileName) { 
    List<T> newList = new ArrayList<>(); 

    //...populate list somehow (e.g. with values deserialized from the file named "filename") 

    return newList; 
} 

यह है कि यह कैसे इस्तेमाल किया जा सकता है:

List<String> names = loadData(String.class, "someFileContainingNameStrings"); 
List<Double> temperatures = loadData(Double.class, "someFileContainingTemperatureData"); 
संबंधित मुद्दे