(कोई सलाह दें कि मैं चाहिए सार X
अधिक है और यह करने के लिए एक और तरीका जोड़ें।)जावा: संयुक्त उदाहरण और कास्ट?
सी ++ में, जब मैं प्रकार के एक चर x
है और मैं कुछ विशिष्ट करना चाहते हैं यह प्रकार Y*
की भी है (Y
X
का एक उपवर्ग जा रहा है), मैं इस लिख रहा हूँ: (? या यह है)
if(Y* y = dynamic_cast<Y*>(x)) {
// now do sth with y
}
एक ही बात जावा में संभव नहीं लगता है।
मैं बजाय इस जावा कोड को पढ़ लिया है:
if(x instanceof Y) {
Y y = (Y) x;
// ...
}
कभी कभी, आप एक चर x
की जरूरत नहीं है जब, लेकिन यह सिर्फ इस समस्या के कारण के बजाय एक अधिक जटिल अभिव्यक्ति है, है, तो आप एक डमी चर की जरूरत है जावा में:
X x = something();
if(x instanceof Y) {
Y y = (Y) x;
// ...
}
// x not needed here anymore
(आम बात यह है कि something()
iterator.next()
है और वहाँ आप देखते हैं कि आप भी वास्तव में सिर्फ दो बार है कि फोन नहीं कर सकते हैं आप वास्तव में डमी चर की जरूरत है।।।)
आपको वास्तव में x
की ज़रूरत नहीं है - आपको बस यह है क्योंकि आप instanceof
को कलाकार के साथ एक बार जांच नहीं सकते हैं। कि तुलना बहुत आम सी ++ कोड के लिए फिर से:
if(Y* y = dynamic_cast<Y*>(something())) {
// ...
}
इस वजह से
, मैं एक castOrNull
समारोह जो यह संभव डमी चर x
से बचने के लिए बनाता है शुरू की है। अब मैं यह लिख सकते हैं: castOrNull
की
Y y = castOrNull(something(), Y.class);
if(y != null) {
// ...
}
कार्यान्वयन:
public static <T> T castOrNull(Object obj, Class<T> clazz) {
try {
return clazz.cast(obj);
} catch (ClassCastException exc) {
return null;
}
}
अब, मुझे बताया गया था कि using this castOrNull
function in that way is an evil thing do to। ऐसा क्यों है? (या प्रश्न अधिक सामान्य डाल करने के लिए: यदि आप बात से सहमत हैं और यह भी लगता है कि इस बुराई है यदि हाँ, क्यों इतनी या आपको लगता है कि यह एक वैध (शायद दुर्लभ मामला) का उपयोग है???)
के रूप में कहा , मैं एक चर्चा नहीं चाहता हूं कि इस तरह के डाउनकास्ट का उपयोग बिल्कुल अच्छा विचार है। लेकिन मुझे शीघ्र ही स्पष्ट कारण है कि मैं कभी कभी इसका इस्तेमाल करते हैं:
कभी कभी मैं इस मामले में जहां मैं (एक बहुत ही विशेष बात के लिए एक और नई विधि जोड़ने जो केवल एक में एक ही उपवर्ग के लिए लागू होगी के बीच चयन करने के लिए है में मिल विशिष्ट मामला) या
instanceof
चेक का उपयोग कर। असल में, मेरे पासdoSomethingVeryVerySpecificIfIAmY()
फ़ंक्शन जोड़ने याinstanceof
चेक करने के बीच विकल्प है। और ऐसे मामलों में, मुझे लगता है कि उत्तरार्द्ध अधिक स्वच्छ है।कभी-कभी मेरे पास कुछ इंटरफ़ेस/बेस क्लास का संग्रह होता है और
Y
के सभी प्रविष्टियों के लिए, मैं कुछ करना चाहता हूं और फिर उन्हें संग्रह से हटा देना चाहता हूं। (उदा मैं इस मामले में जहां मैं एक वृक्ष संरचना था और मैं सभी बच्चे जो खाली लीफ़्स हैं नष्ट करने के लिए चाहता था।)
मैं _class.cast_ के बजाय _instanceOf_ का उपयोग _castOrNull_ में अनावश्यक अपवाद से बचने के लिए होगा, लेकिन अलग से आप पूरी तरह से सामान्य सहायक है लगता है कि। चलो ** टॉम ** स्पष्ट करें कि उसका क्या मतलब था। –
यदि वाई एक्स का _superclass_ है, तो आपको बिल्कुल कोई कलाकार नहीं चाहिए - क्या आपका मतलब _subclass_ है? –
हालांकि यह जावा में एक-लाइनर नहीं है, उदाहरण और कास्टिंग का प्रदर्शन काफी अच्छा है। मैं यहां समस्या के विभिन्न दृष्टिकोणों के आसपास जावा 7 में कुछ समय पोस्ट कर रहा हूं: http://stackoverflow.com/questions/16320014/java-optimization-nitpick-is-it-faster-to-cast-something-and-let-it- फेंक-एक्ससेप/28858680 # 28858680 – Wheezil