2013-04-29 7 views
13

मैं सोच रहा था क्यों जावा, एक बूलियन से किसी पूर्णांक पर कास्टिंग की अनुमति नहीं है इसलिए की तरह:क्यों जावा बुलीयन कास्ट करने की अनुमति नहीं देता -> Int?

boolean foo = true; 
int bar = (int)foo; 

इस कोड की एक पंक्ति में किया जा सकता उदाहरण के लिए,

bar = foo ? 1 : 0; 

लेकिन ऐसा लगता है कि double और int के साथ टाइप-कास्टिंग की अनुमति देने के लिए एक बेहतर और आसान-पढ़ने वाला तरीका होगा। जावा में यह सुविधा क्यों शामिल नहीं है?

+16

क्योंकि 'int' 'बूलियन' नहीं है। –

+1

कास्टिंग के लिए नियम क्या होंगे? शून्य झूठा है, और कुछ भी सच है? नकारात्मक संख्याओं को कैसे संभाला जाएगा? क्या आपको गणित करने की अनुमति होगी? –

+5

* "जावा में यह सुविधा क्यों शामिल नहीं है?" * कोई पूछ सकता है कि जावा में ऐसी कई चीजें शामिल नहीं हैं जो एक कोड लाइन में हासिल की जा सकें। मैं कारण के रूप में 'एपीआई bloat' posit होगा। –

उत्तर

23

यह इसकी अनुमति नहीं देता है क्योंकि जावा डिज़ाइनर (सही ढंग से) ने मान्यता दी है कि सी और सी ++ में बूलियन/पूर्णांक ओवरलोडिंग त्रुटियों का एक महत्वपूर्ण स्रोत था।

(मैं कुछ डिजाइन औचित्य में लिखित रूप में देख याद है कि है, लेकिन मैं यह नहीं मिल सकता है।)

उदाहरण के लिए:

if (i = 0) { 
    ... 
} 

कानूनी है, लेकिन शायद एक बग है कि एक आवेदन में सी या सी ++ लिखा है।

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


अब इस व्याख्या नहीं करता है तुम क्यों नहीं स्पष्ट रूप से प्रकार एक boolean डाली एक int कर सकते हैं। लेकिन मुझे लगता है कि निम्नलिखित को देख कर समझा जा सकता है:

  • आप शायद ही कभी ऐसा करने की जरूरत वास्तविक जावा कार्यक्रमों में।

  • संख्या < -> बूलियन कास्टिंग अन्य प्रकार के कामों के तरीके से जेल नहीं करेगा। विशेष रूप से, अन्य प्रकार के लिए अप-कास्ट और डाउन-कास्ट होते हैं, और जावा में को स्पष्ट प्रकार कास्ट की आवश्यकता नहीं होती है।

  • आप संख्याओं और स्ट्रिंग के बीच या अन्य वस्तुओं के तारों के बीच टाइपकास्ट नहीं कर सकते हैं। ये रूपांतरण हैं, टाइप नहीं करते हैं। और int < ->boolean भी है।


1 - मैं यहाँ (जानबूझ कर) मेरी शब्दावली के साथ खराब किया जा रहा हूँ। सही जावा शब्दावली "चौड़ा" और "संकीर्ण" है। रूपांतरणों को संक्षिप्त करने के लिए अक्षर के लिए सीमित अपवाद के साथ एक स्पष्ट प्रकार का कलाकार होना आवश्यक है। रूपांतरणों को चौड़ा करने के लिए एक प्रकार कास्ट की आवश्यकता नहीं होती है।

+0

विषय से संबंधित आपका उदाहरण कैसा है? यह शायद सी/सी ++ में एक बग है क्योंकि यह वास्तव में मुझे एक मान निर्दिष्ट करता है, जो जावा में किसी भी खंड में समर्थित नहीं है। प्रकार बुलियन के साथ संबंध क्या है? – Nearoo

+0

उदाहरण प्रासंगिक है क्योंकि यह जावा भाषा डिजाइन निर्णय के लिए 'int' से 'बूलियन' तक कास्टिंग की अनुमति न देने के लिए * एक कारण * दिखाता है। –

+0

आह मुझे अब मिल गया है, लेकिन आपकी व्याख्या के कारण नहीं (क्षमा करें)। यहां बताया गया है कि उदाहरण प्रासंगिक क्यों है: अभिव्यक्ति 'ए = के' हमेशा' के' लौटाती है। तो 'अगर (ए = 1) 'काम नहीं करता है क्योंकि जावा' if (1) 'का मूल्यांकन करता है जो अवैध है क्योंकि यह' int' को' bool 'नहीं डालता है। लेकिन क्या यह तथ्य है कि यह वास्तव में कारण बहुत प्रवण होगा? क्योंकि 'if (a = true)' अभी भी कानूनी है। – Nearoo

2

क्योंकि जावा दृढ़ता से लिखा गया है, एक boolean और एक int are two completely different data types और एक अन्य को casted नहीं किया जा सकता है - यह वास्तव में, casted नहीं किया जा सकता।

+18

एक टॉटोलॉजी। आप इसे कास्ट नहीं कर सकते क्योंकि इसे कास्ट नहीं किया जा सकता है। –

3

जावा आदिम संख्यात्मक प्रकारों पर रूपांतरणों को चौड़ा करने का समर्थन करता है।हालांकि, बूलियन को संख्यात्मक प्रकार नहीं माना जाता है।

समर्थित विस्तृत रूपांतरण जावा भाषा विशिष्टता में "Widening Primitive Conversion" के अंतर्गत सूचीबद्ध हैं।

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

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