2012-04-13 21 views
5

मेरे पास एक विधि है जो List<?> को तर्क के रूप में लेती है।जावा जेनेरिक प्रकार तर्क

public static String method(List<?> arg){ 
    // Do something based on type of the list 
} 

//I call the method as below 
List<ClassA> listA = new ArrayList<ClassA>(); 
List<ClassB> listB = new ArrayList<ClassB>(); 
method(listA); 
method(listB); 

method में, मैं कैसे पता चलेगा कि argClassA के List या ClassB के List है?

+2

पैरामीटर प्रकार को ' 'के रूप में घोषित करने का अर्थ है कि आप वास्तविक प्रकार में रुचि नहीं रखते हैं। – biziclop

+0

इस http://stackoverflow.com/questions/1942644/get-generic-type-of-java-util-list – evanwong

+0

@evanwong का डुप्लिकेट - सुनिश्चित नहीं है कि मैं इसे एक डुप्ली से सहमत करूंगा। – djangofan

उत्तर

3

उपयोगकर्ता द्वारा एक जवाब से कहा जाता Romain "आप < का उपयोग करते हैं?>, क्या आपका मतलब है आप कहीं भी parametrized प्रकार का उपयोग करने के लिए नहीं जा रहे हैं। या तो विशिष्ट प्रकार के लिए जाना (आपके मामले में ऐसा लगता है सूची < स्ट्रिंग>) या बहुत सामान्य सूची < ऑब्जेक्ट> "

इसके अलावा, मेरा मानना ​​है कि यदि आप प्रश्न चिह्न का उपयोग करते हैं तो संकलक रनटाइम (प्रभावशाली जावा का संशोधित पी .1 9) तक मिस्केच को पकड़ नहीं लेता है, मिटाए जाने से प्रभावी ढंग से और प्रभावी ढंग से जेनेरिक प्रकारों का उपयोग करने से प्राप्त लाभ को दूर करना ???

प्रश्नकर्ता के प्रश्न का उत्तर देने के लिए: यदि आप सूची < ऑब्जेक्ट> का उपयोग करते हैं और फिर इसे ए या बी में डालने का प्रयास करते हैं, संभवतया exampleOf का उपयोग करके, यह बताए जाने का एक तरीका हो सकता है कि यह क्या है। मैं शर्त लगाता हूं कि ऐसा करने के लिए ऐसा करने का एक बेहतर तरीका है।

+1

+1 जेनेरिक टाइप_ – jahroy

+1

का उपयोग करने से प्राप्त लाभ को प्रभावी ढंग से समाप्त कर रहा है जिसका अर्थ है "मैं जेनेरिक का उपयोग नहीं कर रहा हूं लेकिन मैं संकलक चेतावनी से छुटकारा पाना चाहता हूं।" – user949300

+3

-1 क्योंकि यह उत्तर खराब कोडिंग अभ्यास को प्रोत्साहित करता है। एक सामान्य प्रकार तर्क तर्क लेने वाली विधि को परिभाषित करने का यह उचित तरीका है - यह आपको सुरक्षा टाइप करता है और गन्दा कास्टिंग की आवश्यकता नहीं होती है। जहरॉय द्वारा जवाब देखें। –

1

अपने उदाहरण को देखते हुए, List पर जेनेरिक प्रकार के तर्क क्या हैं, यह जानने का कोई तरीका नहीं है। वे एक उदाहरण स्तर पर मिटा दिया जाता है।

14

तकनीकी रूप से, आप CAN उपयोग instanceof यदि एक वस्तु एक निश्चित प्रकार है की जाँच करने के।

हालांकि ... एक अच्छा विचार है।

तरह से आप अपने विधि घोषित कर दिया है, यह किसी भी प्रकार की एक सूची को स्वीकार कर सकते हैं, इसलिए यह जरूरी एक या बी

होने जा रहा नहीं है

यह बताने के लिए आप क्या करने की कोशिश कर रहे हैं क्या मुश्किल है , लेकिन आपको शायद अपनी विधि जेनेरिक बनाना चाहिए।

आप इस तरह ऐसा कर सकते हैं:

public static <T> String method(List<T> arg) { 
    // We now know that the type of the list is T, which is 
    // determined based on the type of list passed to this 
    // method. This would demonstrate the point better if 
    // the return type was T, but I'm leaving the return type 
    // as String, because that's what your code returns. 
} 

यहाँ एक बेहतर उदाहरण है:

आप एक सामान्य विधि है कि एक सूची के पहले तत्व देता है बनाना चाहते हैं, तो आप ऐसा करेंगे:

public static <T> T firstElement(List<T> theList) { 
    if (theList == null) { 
     return null; 
    } 
    T objectOfTypeT = theList.get(0); 
    return objectOfTypeT; 
} 

ध्यान दें कि वापसी प्रकार अब T है।

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

आप आमतौर पर केवल theList.get(0) लौटाएंगे, लेकिन मैंने जेनरिक के उद्देश्य को और स्पष्ट बनाने के लिए एक पंक्ति जोड़ा।वाक्य रचना की

स्पष्टीकरण:

  • <T> इंगित करता है कि इस विधि टी

  • T कि तुरंत इस प्रकार वापसी प्रकार है नामित एक प्रकार पैरामीटर लेता है (जैसे आप सामान्य वापसी स्ट्रिंग, इंटीजर, आदि ...)।

  • सूची पैरामीटर में T यह है कि संकलक जानता है कि बिल्ली T हैक क्या है। "इस विधि की उम्मीद प्रकार टी के बारे में कुछ ओह देखो ... सूची, किसी को इस विधि के लिए तार की एक सूची से गुजरता है प्रकार टी की भी है टी से:

इस संकलक कहने के लिए अनुमति देता है एक स्ट्रिंग होना चाहिए। किसी को इस विधि को पूर्णांकों की एक सूची से गुजरता है, टी एक पूर्णांक होना चाहिए। "

इसके विपरीत, अपने विधि केवल एक स्ट्रिंग लौट सकते हैं और यह पता नहीं किस प्रकार में प्रयोग किया जाता है सूचि।


भी ...

ए और बी दोनों एक ही कक्षा, TheParentClass नामित विस्तार, तो आप इस तरह अपने प्रणाली की घोषणा कर सकता है:

public static String method(List<? extends TheParentClass> arg) 

इस तरह, आप जानते होंगे आपके पैरामीटर के संभावित प्रकारों के बारे में थोड़ा और (और संकलित समय प्रकार की जांच से लाभ प्राप्त कर सकते हैं)।

+0

आपके द्वारा दिया गया अंतिम उदाहरण "? पेरेंट क्लास बढ़ाता है" शायद यह कैसे है? इस्तेमाल किया जाने वाला "मतलब" था। एक के उपयोग की अनुमति है? विस्तारित बिट के बिना, डेविड मेसन सुझाव देते हैं, बुरा अभ्यास लेकिन कानूनी। मुझे लगता है कि जहां्रॉय को मेरे बजाय इस सवाल का जवाब दिया जाना चाहिए क्योंकि उसने इसे दबाया था। – djangofan

संबंधित मुद्दे