यदि ऑब्जेक्ट एक प्रकार का पैरामीटर है तो परीक्षण करें


86

क्या यह निर्धारित करने का कोई तरीका है कि कोई वस्तु सामान्य प्रकार का उदाहरण है या नहीं?

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

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

जवाबों:


128

इस जाँच को करने का एकमात्र तरीका यह है कि क्या आपके पास Classइस प्रकार का प्रतिनिधित्व करने वाली वस्तु है:

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

यदि आप typeएक विधि पैरामीटर के रूप में प्राप्त नहीं करना चाहते हैं , तो शायद आप इसे शुरू करना चाहते हैं:Class type = ((T) new Object()).getClass();
जोर्डिविलप्लाना

9
@ जोर्डिवापलाना यह सही नहीं है, यह आपको java.lang.bject देगा। इसे देखें: ideone.com/bxt9Jq
श्री हर्ष चिलकापति

3
का प्रयोग करें:Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
टन Snoei

22

मार्क पीटर्स के नमूने का विस्तार करने के लिए, अक्सर आप कुछ ऐसा करना चाहते हैं:

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

11

यदि आप मार्क पीटर्स द्वारा उल्लिखित पैरामीटर के रूप में क्लास टाइप पास नहीं करना चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं। कुदोस टू डेविड ओ'मैरा।

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

5
यह देता हैType safety: Unchecked cast from Type to Class<T>
मार्को सुल

5

आप यह कोशिश कर सकते हैं,

// 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....
}

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

3

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


1
यदि आप रनटाइम पर सही प्रकार का टी जानना चाहते हैं, तो यह आवश्यक है कि कॉलर क्लास <टी> में पास हो, क्लास <नहीं? विस्तार> टी। उदाहरण के लिए, पूस का कोड कक्षा <के साथ संकलित नहीं होगा? विस्तार> टी।
थियोडोर मर्डॉक

1

यह केवल (आंशिक रूप से) काम करेगा यदि आपके पास टाइप टी की कोई वस्तु है तो आप उस वस्तु का वर्ग प्राप्त कर सकते हैं, देखें java.lang.Class<T> और पा क्या यह प्रश्न में वस्तु के समान है।

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


क्लास <?? एक .getClass () से एक गैर-अशक्त टी उदाहरण पर कॉल किया जाता है, क्लास <<> होने की गारंटी नहीं है। आप जो सबसे अच्छा गारंटी दे सकते हैं कि वह एक क्लास <है? विस्तार> टी।
थियोडोर मर्डॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.