2012-03-01 12 views
8

मैं अभी संकलक से इस दिलचस्प संदेश में आया हूं और मुझे नहीं पता कि यह क्यों हो रहा है। यहाँ मामलेबटन पर कास्टिंग अनावश्यक है - क्यों?

उदाहरण 1.

Button test = (Button) findViewById(R.id.someButtonId); 
test.setOnClickListener(this); 

उदाहरण 2.

findViewById(R.id.someButtonId).setOnClickListener(this); 

पहले उदाहरण में है, मैं एक वस्तु Button को findViewById द्वारा दिया कास्ट करने के लिए की जरूरत है। दूसरे उदाहरण में, मुझे लौटा ऑब्जेक्ट डालना नहीं है क्योंकि मैंने Button क्लास ऑब्जेक्ट का उपयोग नहीं किया था। अगर मैं

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this); 

के माध्यम से इसे डालने का प्रयास करता हूं तो मुझे चेतावनी Casting findViewById(R.id.someButtonId) to Button is redundant मिल जाएगी।

ऐसा क्यों हो रहा है? मैं कास्ट चेतावनी को हटाने की कोशिश नहीं कर रहा हूं। मैं के पीछे तर्क को जानना चाहता हूं और अगर मैं findViewById द्वारा लौटाई गई ऑब्जेक्ट के साथ किसी अन्य ऑब्जेक्ट को प्रारंभ करने का प्रयास नहीं करता तो कास्टिंग की आवश्यकता क्यों नहीं है।

+0

http://stackoverflow.com/questions/3502690/remove-redundant-casts-in-java –

+0

@ सैमिर मुझे पता है कि इसे कैसे निकालना है :)। मुझे इसकी आवश्यकता नहीं है। मैं पूछ रहा हूं ** क्यों ** कास्टिंग की आवश्यकता नहीं है। – sandalone

+0

:(मुझे चेतावनी नहीं मिल रही है – Triode

उत्तर

6

करने के लिए कारण काफी है। इसका मतलब है कि कलाकारों के बिना भी आप श्रोता सेट कर सकते हैं। इस प्रकार आपकी कास्ट अनावश्यक है।

+0

यहां भी पूछने के लिए: क्या यह examp2 की तरह इसका उपयोग सुरक्षित है? – sandalone

+1

उदाहरण के रूप में इसका सही 2. –

+0

आपको क्यों लगता है कि यह सुरक्षित नहीं होगा? –

2

findViewById() हमेशा दृश्य है जो इस तरह imageView, बटन के रूप में सभी दृश्य की मूल है रिटर्न ...

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

0

मुझे लगता है कि setOnClickListener() बटन के बजाए व्यू में एक विधि है, और इसलिए हाँ: कास्ट अनावश्यक है।

2

इसका कारण यह है कि उदाहरण 1 में आपको स्पष्ट रूप से एक बटन खोजने की आवश्यकता है क्योंकि आप इसे एक बटन चर के लिए असाइन कर रहे हैं।

ऑनक्लिक लिस्टनर किसी भी प्रकार के व्यू के लिए है, इसलिए आपको इसे ऑनक्लिक लिस्टनर सेट करने के लिए व्यू के एक विशिष्ट उप-वर्ग में डालने की आवश्यकता नहीं है।

+0

क्या यह सुरक्षित है तो इसका उपयोग उदाहरण 2 में है ?? ? – sandalone

+1

बिल्कुल। जो भी दृश्य उदाहरण 2 में पाया जाता है, उस पर एक ऑनक्लिक लिस्टनर सेट किया जा सकता है। –

+1

आप वैसे भी जानते होंगे कि यह निश्चित रूप से एक बटन है, क्योंकि आप किसी अन्य दृश्य के लिए आईडी कुछ बटन का उपयोग नहीं करते हैं, है ना? –

1

यह क्योंकि आप setOnClickListener जो View में परिभाषित किया गया है कॉल करने के लिए में Button को View कास्ट करने के लिए की जरूरत नहीं है हो रहा है। आप इस वजह से findViewById रिटर्न View और इस वर्ग के पहले से ही विधि setOnClickListener को परिभाषित करता है क्यों मिलता है यह findViewById(R.id.someButtonId).setOnClickListener(this);

संबंधित मुद्दे