यदि वर्ग B
और वर्ग वर्ग का C
विस्तार करते हैं A
और मेरे पास प्रकार की वस्तु है B
या C
, मैं यह कैसे निर्धारित कर सकता हूं कि यह किस प्रकार का उदाहरण है?
यदि वर्ग B
और वर्ग वर्ग का C
विस्तार करते हैं A
और मेरे पास प्रकार की वस्तु है B
या C
, मैं यह कैसे निर्धारित कर सकता हूं कि यह किस प्रकार का उदाहरण है?
जवाबों:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
चाइल्ड 1 चाइल्ड 1 = नया चाइल्ड 1 () देखें; पेरेंट 1 पेरेंट चिल्ड = नया चाइल्ड 2 (); चाइल्ड 2 चाइल्ड 2 = नया चाइल्ड 2 (); (चाइल्ड 1 इंस्टो पेरेंट 1); (चाइल्ड 1 इंस्टोफ़ चाइल्ड 1); (पेरेंट चिल्ड इंफोऑफ चाइल्ड 2); (पेरेंट चिल्ड इंस्टा पेरेंट १); (parentChild उदाहरण 1 चाइल्ड); code
, यह उदाहरण के इरादे को साफ कर सकता है।
Object.getClass () का उपयोग करें । यह ऑब्जेक्ट का रनटाइम प्रकार लौटाता है।
एकाधिक सही उत्तर प्रस्तुत किए गए थे, लेकिन अभी भी अधिक विधियां हैं: Class.isAssignableFrom()
और बस वस्तु को डालने का प्रयास (जो फेंक सकता है ClassCastException
)।
यदि किसी वस्तु obj
का प्रकार है तो परीक्षण करने के संभावित तरीकों को संक्षेप में बताएं C
:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
null
हैंडलिंग में अंतरnull
हालांकि संभालने में एक अंतर है :
false
अगर obj
है null
( null
कुछ भी उदाहरण नहीं है)।NullPointerException
स्पष्ट रूप से फेंक देगी ।null
क्योंकि null
किसी भी प्रकार के लिए डाली जा सकती हैं!याद रखने के लिए: किसी भी प्रकार का उदाहरण
null
नहीं है , लेकिन इसे किसी भी प्रकार में डाला जा सकता है ।
Class.getName()
यदि " ऑब्जेक्ट का प्रकार नहीं है, C
लेकिन इसका एक उपवर्ग है, तो इसका " एज़ - इंस्ट -ऑफ " टेस्ट करने के लिए उपयोग नहीं किया जाना चाहिए , इसमें पूरी तरह से अलग नाम और पैकेज हो सकता है (इसलिए वर्ग के नाम स्पष्ट रूप से मेल नहीं खाएंगे) लेकिन यह है अभी भी टाइप है C
।Class.isAssignableFrom()
लिए सममित नहीं है : यदि का प्रकार एक उपवर्ग है तो obj.getClass().isAssignableFrom(C.class)
वापस आ जाएगा ।false
obj
C
आप उपयोग कर सकते हैं:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH। लेकिन मुझे लगता है कि ज्यादातर समय यह अच्छा अभ्यास नहीं है कि नियंत्रण प्रवाह या कुछ इसी तरह के लिए ...
सुझाए गए तरीकों में से किसी भी उपयोग को एक कोड गंध माना जाता है जो खराब ओओ डिजाइन में आधारित है।
यदि आपका डिज़ाइन अच्छा है, तो आपको अपने आप को उपयोग करने की आवश्यकता नहीं मिलनी चाहिए getClass()
या instanceof
।
सुझाए गए तरीकों में से कोई भी करेगा, लेकिन डिज़ाइन-वार को ध्यान में रखने के लिए बस कुछ।
हम इस मामले में प्रतिबिंब का उपयोग कर सकते हैं
objectName.getClass().getName();
उदाहरण:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
इस स्थिति में आपको उस वर्ग का नाम मिल जाएगा, जो ऑब्जेक्ट HttpServletRequest
रेफरेंस वैरिएबल को पास करता है।
obj.getClass()
कक्षा का उपयोग करके नाम, उपसर्ग को शब्द से class
request.getClass().getName();
सभी पैकेज प्रिंट! वर्ग नाम के साथ
.isInstance
" Class
" वर्ग पर एक विधि भी है । यदि आप एक वस्तु के वर्ग मिल के माध्यम से myBanana.getClass()
आप अपने वस्तु देख सकते हैं myApple
के रूप में एक ही कक्षा का एक उदाहरण है myBanana
के माध्यम से
myBanana.getClass().isInstance(myApple)
isinstance()
यदि आप रन टाइम में जानना चाहते हैं तो चेक करना पर्याप्त नहीं होगा। उपयोग:
if(someObject.getClass().equals(C.class){
// do something
}
मैंने स्विच केस का उपयोग करने के बजाय रनटाइम पर ऑब्जेक्ट उदाहरण प्राप्त करने के लिए जावा 8 जेनरिक का उपयोग किया
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
किसी भी प्रकार का डेटा पास करें और यह विधि उस डेटा का प्रकार प्रिंट करेगी जिसे आपने कॉल करते समय पास किया था। जैसे
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
निम्नलिखित आउटपुट है
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []