java - Widening equality check for Method type -
मान लीजिए मेरे पास एक इंटरफ़ेस है:
सार्वजनिक इंटरफ़ेस FooInterface {सार्वजनिक शून्य कुछ विधि (); }
और मैं एक वर्ग है कि इस इंटरफेस को लागू करता है:
सार्वजनिक वर्ग FooClass लागू करता FooInterface {सार्वजनिक शून्य someMethod () {// शानदार चीज़ों} सार्वजनिक शून्य someOtherMethod () {// अन्य मज़ेदार चीज़ें}}
वहाँ एक आसान तरीका खोजने के लिए है, संजीदगी से, FooClass पर विधि है कि FooInterface पर someMethod अप करने के लिए नक्शे? < / P>
मुझे यह गणना करने के लिए निम्नलिखित के जैसा कुछ है, लेकिन मैं उत्सुक था अगर किसी को यह गणना करने के लिए जावा में सिस्टम में बनाया गया था? मैं यह करने के लिए निम्न कोड बाहर काम किया है (वहाँ कीड़े हो सकता है, इसलिए सावधान रहना):
सार्वजनिक बूलियन isMethodEquality (विधि meth1, विधि meth2) {// समानता बूलियन isAssignable के लिए कक्षाओं की घोषणा की जाँच करें ; isAssignable = meth1.getDeclaringClass () isAssignableFrom (meth2.getDeclaringClass (); isAssignable | = meth2.getDeclaringClass () isAssignableFrom (meth1.getDeclaringClass ());। अगर (isAssignable) {return false;} के लिए नामों की जाँच //।! समानता यदि {return false;} (meth1.getName () बराबर (meth2.getName ())।) (।!। meth1.getParameterTypes () लंबाई = meth2.getParameterTypes () लंबाई) यदि समानता के लिए मानकों की जांच // {return false;} (int i = 0; मैं। & lt; meth1.getParameterTypes () लंबाई; i ++) के लिए {if (! meth1.getParameterTypes () [मैं] .equals (meth2.getParameterTypes () [i])) {Return false;}} वापस लौटें;}
उपरोक्त हस्ताक्षर की जांच करनी चाहिए। क्या ऐसा करने के लिए एक और अंतर्निर्मित तरीका है?
बराबर है, लेकिन वह काम नहीं कर रहा है, जो समझ में आता है। विधि एक ही विधि के अलग-अलग क्रियान्वयन पैटर्न हैं (जहां, इस मामले में, कोई केवल एक परिभाषा के साथ एक घोषणा नहीं है और दूसरा निश्चित है Iion)।
मुझे यह भी एहसास है कि मैं सिर्फ एक विरासत टिप्पणी जोड़ सकता था, लेकिन मैं इसे से बचने के लिए पसंद करता हूं क्योंकि यह कक्षा विस्फोट कर सकता है। स्ट्राइक>
जैसा कि एक टिप्पणीकार द्वारा नोट किया गया है, टिप्पणियां केवल कक्षाओं पर उत्तीर्ण होती हैं अधिक जानकारी के लिए देखें।
विधियों के लिए मैं वास्तव में क्या देख रहा हूँ, "isAssignableFrom" है, या विधि हस्ताक्षर की आसानी से तुलना करने का तरीका।
धन्यवाद।
< सबसे आसान (और नहीं, यह अच्छी तरह से प्रदर्शन करने वाला नहीं है लेकिन संभवतः ऐसा कुछ नहीं है जो आप ' इस मामले के बारे में ध्यान रखें) ऐसा करने का तरीका concreteClass.getMethod ()
: विधि interfaceMethod = ...; // पद्धति जिसका कार्यान्वयन आप प्रयास करने के लिए देख रहे हैं {विधि कार्यान्वयन Method = concreteclass.getMethod (interfaceMethod.getName ()), interfaceMethod.getParameterTypes ()); } पकड़ (NoSuchMethodException E) {// आपका क्लास अमूर्त हो सकता है और इस प्रकार वह विधि लागू नहीं होता} पकड़ (सुरक्षाएक्सेप्शन ई) {// अपर्याप्त अनुमति}
Comments
Post a Comment