2011-04-20 19 views
51

का उदाहरण है, तो यह निर्धारित करने का कोई तरीका है कि कोई ऑब्जेक्ट सामान्य प्रकार का उदाहरण है या नहीं?यदि ऑब्जेक्ट पैरामीटर प्रकार

public <T> test(Object obj) { 
    if (obj instanceof T) { 
     ... 
    } 
} 

यह स्पष्ट रूप से काम नहीं करता है। क्या कोई विकल्प है? जैसे कि मैं कक्षा को तुरंत चालू करने के लिए जावा प्रतिबिंब का उपयोग करना चाहता हूं और फिर यह सुनिश्चित करने के लिए जांचें कि यह जेनेरिक T प्रकार है।

उत्तर

80

एक ही तरीका है आप इस चेक कर सकते हैं अगर आप Class ऑब्जेक्ट प्रकार का प्रतिनिधित्व किया है उस वस्तु का वर्ग, java.lang.Class<T> देखें और यह पता लगाएं कि क्या यह प्रश्न में वस्तु के समान है।

लेकिन ध्यान दें कि यह बहुत ही कारण है कि हमारे पास जीनिक्स हैं: सामान्य प्रकार का उपयोग करना यह कहने का एक तरीका है कि आपको परवाह नहीं है कि वास्तव में यह किस प्रकार है (ऊपरी और निचली सीमाओं को निर्दिष्ट किया जा सकता है)।

Class<T> type; //maybe passed to the method 
if (type.isInstance(obj)) { 
    T t = type.cast(obj); 
    // ... 
} 
+0

यदि आप विधि पैरामीटर के रूप में 'टाइप' नहीं प्राप्त करना चाहते हैं, तो शायद आप इसे प्रारंभ करना चाहते हैं:' क्लास टाइप = ((टी) नया ऑब्जेक्ट())। GetClass(); ' – JordiVilaplana

+4

@ जोर्डी विलाप्लाना यह सही नहीं है , यह आपको क्लास के रूप में java.lang.Object देगा। इस की जाँच करें: http://ideone.com/bxt9Jq –

+0

उपयोग: 'कक्षा प्रकार = (कक्षा ) ((ParameterizedType) getClass() getGenericSuperclass()।) getActualTypeArguments() [0];' –

3

टाइप Class प्रकार को पैरामीटरेट करने के लिए उपयोग किया जाता है, इस पर प्रतिबंध लगाने के लिए और अधिक समझदारी होगी। जब आप टाइप करते हैं, Class<?> जैसे कुछ का उपयोग करने के बजाय, आपको Class<? extends T> का उपयोग करना चाहिए।

Class<T> type; //maybe passed into the method 
if (type.isInstance(obj)) { 
    //... 
} 
+1

आप रनटाइम पर टी का सही प्रकार पता करने के लिए चाहते हैं, यह आवश्यक है कि फोन करने वाले एक कक्षा में पारित महत्वपूर्ण है, नहीं एक कक्षा । उदाहरण के लिए, पुस का कोड क्लास से संकलित नहीं होगा। –

1

यह केवल (आंशिक रूप से) कार्य करेगा जब आप प्रकार टी का एक उद्देश्य है तो फिर आप प्राप्त कर सकते हैं:

+0

कक्षा । एक गैर-शून्य टी उदाहरण पर .getClass() कॉल से लौटाया गया है, यह कक्षा कक्षा की गारंटी नहीं है। सबसे अच्छा आप गारंटी दे सकते हैं कि यह कक्षा है। –

12

मार्क पीटर्स के नमूने का विस्तार करने के लिए, अक्सर आप की तरह कुछ करना चाहता हूँ मार्क पीटर्स द्वारा वर्णित पैरामीटर, आप निम्न कोड का उपयोग कर सकते हैं। डेविड O'Meara के लिए Kudos।

Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) 
        .getActualTypeArguments()[0]; 
    if (type.isInstance(obj)) { 
     ... 
    } 
6

आप इस कोशिश कर सकते

// Cast your object to the generic type. 
T data = null; 
try { 
    data = (T) obj; 
} catch (ClassCastException cce) { 
    // Log the error. 
} 

// Check if the cast completed successfully. 
if(data != null) { 
    // whatever.... 
} 
+1

** यह काम नहीं करता है! ** कलाकार ** सभी ** प्रकारों के लिए सफल होता है। यही कारण है कि यह एक "अनचेक कास्ट" संकलन चेतावनी देता है। – Lii

1

, आप कक्षा प्रकार के रूप में पारित करने के लिए नहीं करना चाहते हैं:

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