2010-08-30 19 views
12

मैं थोड़ा उलझन में हूं: मेरे पास एक फ़ंक्शन है, जो ऑब्जेक्ट को तर्क के रूप में लेता है। लेकिन संकलक शिकायत नहीं करता है अगर मैं सिर्फ एक आदिम पास करता हूं और यहां तक ​​कि बूलियन ऑब्जेक्ट के रूप में एक बूलियन आदिम को भी पहचानता हूं। ऐसा क्यों हैं?जावा: बूलियन इंस्टेंस ओफ बूलियन?

public String test(Object value) 
{ 
    if (! (value instanceof Boolean)) return "invalid"; 
    if (((Boolean) value).booleanValue() == true) return "yes"; 
    if (((Boolean) value).booleanValue() == false) return "no"; 
    return "dunno"; 
} 

String result = test(true); // will result in "yes" 
+2

नोट करें कि एक बुलियन कभी भी बूलियन का उदाहरण नहीं है। आप ऑपरेटर के उदाहरण के लिए कभी भी आदिम नहीं पारित कर सकते हैं। आपके बूलियन आदिम ने कभी भी इस विधि में प्रवेश नहीं किया, मुक्केबाजी तब हुई जब आमंत्रण हुआ और विधि आमंत्रण रूपांतरण हुआ! – Mishax

उत्तर

29

क्योंकि आदिम 'true' AutoboxedBoolean करने के लिए हो जाएगा और जो एक Object है।

+3

(+1) और यहां कुछ [दस्तावेज इसके साथ जाने के लिए] हैं (http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html) –

+0

और पढ़ें: http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html @jpegzz, यदि आप 1.4.x –

+0

के साथ भागते हैं तो कोड संकलित नहीं होगा :) ठीक है, दस्तावेज़ केवल सुझाव देते हैं वास्तव में निष्क्रिय होने पर autoboxing का उपयोग करें तो मैं नहीं होगा। लेकिन यह जानना अच्छा है कि यह एक बग नहीं है लेकिन एक विशेषता है :) – epegzz

2

विधि के इस भाग के साथ नए:

if (((Boolean) value).booleanValue() == true) return "yes"; 
    if (((Boolean) value).booleanValue() == false) return "no"; 
    return "dunno"; 

, साथ

if (value == null) return "dunno"; 
    return value ? "yes" : "no"; 
+0

का उदाहरण है ओपी के कोड व्यवहार के समान नहीं है। 'शून्य' वापस 'अमान्य' होगा क्योंकि 'शून्य' 'बूलियन 'का उदाहरण नहीं है (आप ओपी के कोड से उस पंक्ति को अपने पहले कोड में गायब कर रहे हैं); "डुनो" कभी भी वापस नहीं लौटाया जाएगा (मूल कोड से)। उस पंक्ति के बिना आपका पहला कोड एनपीई फेंक देगा जब मान 'शून्य 'होगा। –

+0

@ करलोस, मैं कभी याद नहीं रख सकता कि 'exampleof' सभी नल के साथ सच या गलत लौटाता है, इसलिए मैं आमतौर पर पहले से शून्य की जांच करके मामले से बचता हूं। –

3

पिछले जवाब की तरह कहते हैं प्रतिस्थापित किया जा सकता इसे ऑटोबॉक्सिंग कहा जाता है।

वास्तव में, संकलन-समय पर, जावैक आपके boolean प्राइमेटवे मान को Boolean ऑब्जेक्ट में बदल देगा। सूचना है कि आम तौर पर रिवर्स परिवर्तन बहुत ही अजीब NullPointerException वजह से उत्पन्न हो सकता है, एक उदाहरण के रूप, निम्नलिखित कोड को:

boolean b = null; 
if(b==true) <<< Exception here ! 

आप अधिक infos के लिए JDK documentation पर एक नज़र ले जा सकते हैं।

+7

क्या आपका मतलब था 'बूलियन बी = नल;' ?? – mlvljr

+1

मुझे लगता है कि आप 'बूलियन बी = नल' के बजाय 'बूलियन बी = नल; 'का मतलब था। राजधानी नोट करें। –