यदि ऑब्जेक्ट इंटरफ़ेस लागू करता है तो परीक्षण करें


149

यह शायद पहले पूछा गया है, लेकिन एक त्वरित खोज ने सी # के लिए पूछे गए एक ही सवाल को सामने लाया। यहाँ देखें।

मैं मूल रूप से क्या करना चाहता हूं कि किसी दिए गए ऑब्जेक्ट को एक दिए गए इंटरफ़ेस को लागू करना है।

मुझे एक समाधान सूझा लेकिन यह सिर्फ इतना आरामदायक नहीं है कि अगर या केस स्टेटमेंट में अक्सर इसका उपयोग किया जाए और मैं सोच रहा था कि जावा में अंतर्निहित समाधान नहीं है।

public static Boolean implementsInterface(Object object, Class interf){
    for (Class c : object.getClass().getInterfaces()) {
        if (c.equals(interf)) {
            return true;
        }
    }
    return false;
}


संपादित करें: ठीक है, आपके उत्तर के लिए धन्यवाद। विशेष रूप से डेमियन पोललेट और नोल्डोरिन के लिए, आपने मुझे अपने डिजाइन पर पुनर्विचार किया, इसलिए मैं अब इंटरफेस के लिए परीक्षण नहीं करता हूं।


3
क्या आप केवल कास्टिंग की कोशिश नहीं कर सकते हैं और अपवाद को पकड़ सकते हैं यदि एक फेंक दिया है (या एक अशक्त परिणाम के लिए भी जांच करें, अगर जावा में सी # "ऑपरेटर" के रूप में कुछ भी विनम्र है)? मैं एक जावा के बजाय एक सी # कोडर हूं, इसलिए मैं मुख्य रूप से यहां केवल अनुमान लगा रहा हूं, हालांकि मुझे लगता है कि इस तरह का दृष्टिकोण किसी भी ओओ भाषा में संभव होगा।
नोल्डोरिन

1
अपवाद फेंकना इस मामले में अच्छा अभ्यास है केवल अगर आपको प्रदर्शन की परवाह नहीं करनी है।
राफा

1
मुझे क्षमा करें लेकिन उन जवाबों ने आपको अपने डिजाइन पर फिर से विचार करने के लिए कहां किया है? भले ही वे हटाए गए, वे क्या थे? क्या आप कृपया मेरी मदद कर सकते हैं @sebastiangeiger
ozanmuyes

1
@ozanmuyes मुझे क्षमा करें, मैंने 4 वर्षों में जावा नहीं लिखा है और दुर्भाग्य से मुझे याद नहीं आया कि मैंने क्या किया।
सेबस्टियनजिगर

जवाबों:


191

instanceofऑपरेटर एक में काम करता है NullPointerExceptionसुरक्षित तरीका। उदाहरण के लिए:

 if ("" instanceof java.io.Serializable) {
     // it's true
 }

पैदावार सही है। जबसे:

 if (null instanceof AnyType) {
     // never reached
 }

झूठी पैदावार, instanceofऑपरेटर शून्य सुरक्षित है (आपके द्वारा पोस्ट किया गया कोड नहीं है)।

instanceof अंतर्निहित होता है, संकलन समय सुरक्षित करने के लिए वैकल्पिक क्लास # isInstance (वस्तु)


5
Instof केवल वर्ग शाब्दिक पर काम करता है। तो यह ओपी के मामले में इस्तेमाल नहीं किया जा सकता है
लॉर्डऑफइंग्स

यकीन है, यह संकलन-समय सुरक्षित है; और यह बिल्ट-इन तरीका है और यह प्रश्न (imho) का तर्क है
dfa

@LordOfThePigs नहीं यह नहीं है। यह जाँचता है कि क्या कोई अंतरफलक aswell कार्यान्वित किया गया है।
निमचम्पस्की

5
@NimChimpsky: आपने मेरी बात को गलत समझा। क्लास के शाब्दिक तब होते हैं जब आप अपने स्रोत कोड में MyClass.classया जैसी चीजें लिखते हैं MyInterface.class। क्लास शाब्दिक रूप से कक्षाओं, इंटरफेस और आदिम प्रकारों का उल्लेख कर सकते हैं, और इसी वर्ग कक्षा को वापस कर देंगे। मेरा कहना है कि ओपी एक वर्ग शाब्दिक का उपयोग नहीं कर रहा है, लेकिन इसके बजाय कक्षा वर्ग का एक उदाहरण है, और दुर्भाग्य से instanceofकीवर्ड के दाहिने हाथ की साइड ऑपरेटर एक वर्ग शाब्दिक होना चाहिए, न कि कक्षा वर्ग का एक उदाहरण।
लॉर्डऑफइंप्ल्स

@dsdsdsdsd इस पोस्ट के बाद से मैंने इसके बारे में सुना / पढ़ा भी नहीं था, लेकिन Google पर देखने के बाद मुझे लगा कि यह नल सूचक अपवाद का संक्षिप्त नाम है।
ओजन्मुय

42

यह करना चाहिए:

public static boolean implementsInterface(Object object, Class interf){
    return interf.isInstance(object);
}

उदाहरण के लिए,

 java.io.Serializable.class.isInstance("a test string")

का मूल्यांकन करता है true


8

मैं पसंद करता हूँ instanceof:

if (obj instanceof SomeType) { ... }

जो कि बहुत अधिक सामान्य और पठनीय है SomeType.isInstance(obj)


5
याद रखें कि if (obj instanceof SomeType) { ... }स्थैतिक (यानी - यह रनटाइम में बदल नहीं सकता है) और SomeType.isInstance(obj)गतिशील है।
टॉमाज़ बिएलसेवस्की


3

यदि आप इंटरफेस के लिए परीक्षण करना चाहते हैं:

public List<myType> getElement(Class<?> clazz) {
    List<myType> els = new ArrayList<myType>();
    for (myType e: this.elements.values()) {
        if (clazz.isAssignableFrom(e.getClass())) {
            els.add(e);
        }
    }
    return els;

}

clazz एक इंटरफेस है और myType एक प्रकार है जिसे आपने परिभाषित किया है जो कई इंटरफेस को लागू कर सकता है। इस कोड के साथ आपको केवल वे प्रकार मिलते हैं जो परिभाषित इंटरफ़ेस को लागू करते हैं


1

मुझे आज रात को एंड्रॉइड के साथ यह समस्या थी और जेवाडॉक समाधानों को देखने के बाद मैं इस असली काम के समाधान के साथ आया जैसे कि मेरे जैसे लोगों के लिए जो कि एक जेवाडॉक स्पष्टीकरण की तुलना में थोड़ा अधिक की आवश्यकता है।

यहां एंड्रॉइड जावा का उपयोग करके वास्तविक इंटरफ़ेस के साथ काम करने का उदाहरण दिया गया है। यह उस गतिविधि की जाँच करता है, जिसे AboutDialogListener क्षेत्र में लाने का प्रयास करने से पहले AboutDialogListener इंटरफ़ेस लागू किया गया था।

public class About extends DialogFragment implements OnClickListener,
    OnCheckedChangeListener {

public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout";


public interface AboutDialogListener {
    void onFinishEditDialog(Boolean _Checked);
}

private AboutDialogListener adl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Activity a = this.getActivity();
    if (AboutDialogListener.class.isInstance(a)) {
        adl = (AboutDialogListener) a;
        }
}

... बाद में मैं जाँचता हूं कि इंटरफ़ेस को कॉल करने से पहले फ़ील्ड adl है या नहीं

@Override
public void onStop() {
    super.onStop();
    sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit();
    // if there is an interface call it.
    if (adl != null) {
        adl.onFinishEditDialog(is_Checked());
    }
}

0

Apache commons-lang ArrayUtils के साथ, देखें कि क्या आपके लिए आवश्यक इंटरफ़ेस आप के ऑब्जेक्ट के इंटरफेस में निहित है

public static Boolean implementsInterface(Object object, Class interf){
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.