दिलचस्प पोस्ट
तिथि और समय के बीच का अंतर w / आउट कार्य सप्ताह Excel एक स्ट्रिंग के रूप में एक चर का नाम प्राप्त करना Numpy / scipy में blas / lapack लिंकिंग को कैसे जांचें? android.util.AndroidRuntimeException: आप कड़ी चोट बर्खास्तगी और कार्रवाई बार गठबंधन नहीं कर सकते एएसपी.नेट एमवीसी – क्या व्यापार तर्क नियंत्रकों में मौजूद है? दिनांक समय पिक्चर: तिथि और समय दोनों को चुनें मैं इंटरनेट एक्सप्लोरर में कंसोल लॉगिंग का उपयोग कैसे कर सकता हूं? सबसे कुशल तरीके से समान सरणी कैसे जांचें? मशीन का आईपी पता प्राप्त करें वैश्विक संदर्भ के साथ एंड्रॉइड सिंगलटन एंड्रॉइड: प्रोग्राम हार्डवेयर से पता चलता है कि डिवाइस हार्डवेयर मेनू बटन है या नहीं जब मेरा ऐप पृष्ठभूमि पर जाता है तो मैं एंड्रॉइड कैसे स्क्रीनशॉट ले सकता हूं? एंड्रॉइड: किस परिस्थिति में एक संवाद प्रदर्शित होने वाला कारण () को कॉल किया जाना चाहिए? जावास्क्रिप्ट का उपयोग करके Google डिस्क का प्रमाणीकरण टी-एसक्यूएल में एक समय कैसे गोल करें

जावा में ट्रिटी टर्नरी ऑपरेटर – ऑटोबॉक्सिंग

निम्नलिखित स्निपेट में साधारण जावा कोड को देखें:

public class Main { private int temp() { return true ? null : 0; // No compiler error - the compiler allows a return value of null // in a method signature that returns an int. } private int same() { if (true) { return null; // The same is not possible with if, // and causes a compile-time error - incompatible types. } else { return 0; } } public static void main(String[] args) { Main m = new Main(); System.out.println(m.temp()); System.out.println(m.same()); } } 

जावा कोड के इस सरलतम में, temp() पद्धति का कोई संकलक त्रुटि नहीं है, भले ही फ़ंक्शन का रिटर्न प्रकार int , और हम मान null (रिटर्न के माध्यम से वापस लौटने की कोशिश कर रहे हैं return true ? null : 0; ) संकलित होने पर, यह स्पष्ट रूप से रन टाइम अपवाद NullPointerException कारण बनता है।

हालांकि, ऐसा प्रतीत होता है कि एक ही बात गलत है अगर हम टर्नरी ऑपरेटर को एक if स्टेटमेंट के साथ प्रस्तुत करते हैं ( same() विधि के अनुसार), जो एक संकलन-समय त्रुटि जारी करता है ! क्यूं कर?

वेब के समाधान से एकत्रित समाधान "जावा में ट्रिटी टर्नरी ऑपरेटर – ऑटोबॉक्सिंग"

कंपाइलर एक Integer लिए एक रिक्त संदर्भ के रूप में अशक्त की व्याख्या करता है, सशर्त ऑपरेटर के लिए ऑटोबॉक्सिंग / अनबॉक्सिंग नियम लागू करता है (जैसा कि जावा भाषा विशिष्टता, 15.25 में वर्णित है), और खुशी से आगे बढ़ता है। यह रन समय पर एक NullPointerException उत्पन्न करेगा, जिसे आप इसे कोशिश कर पुष्टि कर सकते हैं।

मुझे लगता है, जावा कंपाइलर true ? null : 0 व्याख्या true ? null : 0 true ? null : 0 एक Integer अभिव्यक्ति के रूप में, जो NullPointerException करने के लिए पूर्ण रूप से कनवर्ट किया जा सकता है, संभवतः NullPointerException दे रही है।

दूसरे मामले के लिए, अभिव्यक्ति null विशेष नल प्रकार का है , इसलिए कोड return null टाइप बेमेल टाइप करता है।

असल में, इसके सभी जावा भाषा विशिष्टता में समझाया गया।

एक सशर्त अभिव्यक्ति का प्रकार निम्नानुसार निर्धारित होता है:

  • यदि दूसरे और तीसरे ऑपरेंड के पास एक ही प्रकार (जो कि नल प्रकार हो) हो सकता है, तो वह सशर्त अभिव्यक्ति का प्रकार है

इसलिए आपके " (true ? null : 0) " (true ? null : 0) में "अशक्त" एक पूर्णांक प्रकार हो जाता है और फिर पूर्णांक में ऑटोबॉक्स होता है

इस तरह से कुछ करने के लिए (true ? null : null) यह (true ? null : null) और आप संकलक त्रुटि प्राप्त करेंगे।

if बयान के मामले में, null संदर्भ को एक Integer संदर्भ के रूप में नहीं माना जाता है क्योंकि यह एक ऐसी अभिव्यक्ति में भाग नहीं ले रहा है जो इसे इस तरह के रूप में व्याख्या करने के लिए मजबूर करता है इसलिए त्रुटि तुरंत संकलित समय पर पकड़ी जा सकती है क्योंकि यह अधिक स्पष्ट रूप से एक प्रकार की त्रुटि है।

सशर्त ऑपरेटर के लिए, जावा भाषा विशिष्टता §15.25 "सशर्त ऑपरेटर ? : ? : "नियमों में किस तरह से रूपांतरण लागू किया जाता है यह अच्छी तरह से जवाब देती है:

  • यदि दूसरे और तीसरे ऑपरेंड के पास एक ही प्रकार (जो कि नल प्रकार हो) हो सकता है, तो वह सशर्त अभिव्यक्ति का प्रकार है

    लागू नहीं होता क्योंकि null int नहीं है


  • यदि दूसरे और तीसरे ऑपरैंडों में से कोई एक प्रकार का बूलियन है और दूसरे प्रकार का प्रकार बूलियन है, तो सशर्त अभिव्यक्ति का प्रकार बूलियन है।

    लागू नहीं होता है क्योंकि न तो null और न ही boolean या Boolean


  • यदि दूसरे और तीसरे ऑपरैंडों में से कोई एक रिक्त प्रकार का है और दूसरे प्रकार का प्रकार संदर्भ प्रकार है, तो सशर्त अभिव्यक्ति का प्रकार यह संदर्भ प्रकार है

    लागू नहीं है क्योंकि null प्रकार का नल है, लेकिन int कोई संदर्भ प्रकार नहीं है।


  • अन्यथा, यदि दूसरे और तीसरे ऑपरैन्ड में ऐसे प्रकार होते हैं जो परिवर्तनीय (§5.1.8) संख्यात्मक प्रकार के होते हैं, तो कई मामले हैं: […]

    लागू होता है: null को एक संख्यात्मक प्रकार के लिए परिवर्तनीय माना जाता है, और §5.1.8 में परिभाषित किया गया है "अनब्लॉकिंग रूपांतरण" जो एक NullPointerException फेंकने के लिए है।

पहली बात यह है कि जावा टर्नरी ऑपरेटरों के पास एक "प्रकार" है, और यह कि संकलक निर्धारित करेगा और इस पर विचार करेगा कि कोई भी दूसरी या तीसरे पैरामीटर के वास्तविक / वास्तविक प्रकार क्या नहीं हैं। कई कारकों के आधार पर टर्नरी ऑपरेटर प्रकार को अलग-अलग तरीकों से निर्धारित किया जाता है जैसा कि जावा भाषा विशिष्टता 15.26 में दिखाया गया है

ऊपर दिए गए प्रश्न में हमें अंतिम मामले पर विचार करना चाहिए:

अन्यथा, दूसरा और तीसरा ऑपरेटिंग क्रमशः एस 1 और एस 2 प्रकार के होते हैं। T1 को ऐसे प्रकार दें, जो मुक्केबाजी रूपांतरण को एस 1 से लागू करने के परिणामस्वरूप आते हैं, और टी 2 को ऐसे प्रकार बताएं जो मुक्केबाजी रूपांतरण को एस 2 से लागू करने के परिणामस्वरूप आते हैं। सशर्त अभिव्यक्ति का प्रकार कैश रूपांतरण (§5.1.10) को लॉब (टी 1, टी 2) (§15.12.2.7) के लिए लागू करने का नतीजा है।

एक बार जब आप कैप्चर कनवर्जन (§5.1.10) को लागू करने पर ध्यान देते हैं, तो सबसे जटिल मामले यह है और सबसे अधिकतर लब (टी 1, टी 2) में

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

उदाहरण के लिए, यदि आप निम्न प्रयास करें:

 long millis = System.currentTimeMillis(); return(true ? new java.sql.Timestamp(millis) : new java.sql.Time(millis)); 

आप देखेंगे कि सशर्त अभिव्यक्ति की परिणामी प्रकार java.util.Date क्योंकि यह Timestamp / Time जोड़ी के लिए "कम से कम सामान्य सुपरक्लास" है।

चूंकि null कुछ भी ऑटोबॉक्स किए जा सकते हैं, "कम से कम कॉमन सुपरक्लस" Integer वर्ग है और यह ऊपर की सशर्त अभिव्यक्ति (टर्नरी ऑपरेटर) का रिटर्न प्रकार होगा। वापसी मान तब Integer प्रकार का एक रिक्त सूचक होगा और वह इसी प्रकार टर्नरी ऑपरेटर द्वारा दिया जाएगा।

रनटाइम पर, जब जावा वर्चुअल मशीन Integer एक नलपॉइंटर एक्सेप्शन फेंक दिया जाता है। ऐसा इसलिए होता है क्योंकि JVM फ़ंक्शन null.intValue() को लागू करने का प्रयास करता है, जहां null autoboxing का परिणाम है।

मेरी राय में (और जब से मेरी राय जावा भाषा विशिष्टता में नहीं है तो बहुत से लोग इसे गलत तरीके से खोज पाएंगे) संकलक आपके प्रश्न में अभिव्यक्ति का मूल्यांकन करने में एक खराब नौकरी करता है। यह देखते हुए कि आपने true ? param1 : param2 लिखा true ? param1 : param2 true ? param1 : param2 संकलक को तुरंत तय करना चाहिए कि पहले पैरामीटर – null – वापस किया जाएगा और यह एक कंपाइलर त्रुटि उत्पन्न करना चाहिए। यह कुछ हद तक समान होता है जब आप while(true){} etc... लिखते हैं while(true){} etc... और कंपाइलर लूप के नीचे के कोड के बारे में शिकायत करता है और इसे बिना Unreachable Statements साथ झंडे करता है।

आपका दूसरा मामला बहुत सरल है और यह उत्तर पहले से बहुत लंबा है …;)

भूल सुधार:

एक और विश्लेषण के बाद मेरा मानना ​​है कि मुझे यह कहना गलत था कि एक null मूल्य बॉक्सिंग / ऑटोबॉक्स किया जा सकता है क्लास पूर्णांक के बारे में बात करते हुए, स्पष्ट मुक्केबाजी में new Integer(...) कन्स्ट्रक्टर या संभवतः Integer.valueOf(int i); (मैं कहीं इस संस्करण पाया) पूर्व में नंबर NumberFormatException (और ऐसा नहीं होता) फेंक दिया जाएगा, जबकि दूसरा NumberFormatException नहीं बना सकता क्योंकि int नहीं हो सकता है …

दरअसल, पहले मामले में अभिव्यक्ति का मूल्यांकन किया जा सकता है, क्योंकि कंपाइलर जानता है कि उसे Integer रूप में मूल्यांकन किया जाना चाहिए, हालांकि दूसरे मामले में रिटर्न वैल्यू ( null ) का प्रकार निर्धारित नहीं किया जा सकता है, इसलिए यह नहीं हो सकता संकलित। यदि आप इसे Integer , तो कोड संकलित होगा।

 private int temp() { if (true) { Integer x = null; return x;// since that is fine because of auto-boxing then the returned value could be null //in other words I can say x could be null or new Integer(intValue) or a intValue } return (true ? null : 0); //this will be prefectly legal null would be refrence to Integer. The concept is one the returned //value can be Integer // then null is accepted to be a variable (-refrence variable-) of Integer } 

इस बारे में कैसा है:

 public class ConditionalExpressionType { public static void main(String[] args) { String s = ""; s += (true ? 1 : "") instanceof Integer; System.out.println(s); String t = ""; t += (!true ? 1 : "") instanceof String; System.out.println(t); } } 

उत्पादन सच है, सच है

ग्रहण रंग कोड 1 को सशर्त अभिव्यक्ति में autoboxed जैसा है

मेरा अनुमान है कि संकलक ऑब्जेक्ट के रूप में अभिव्यक्ति के रिटर्न प्रकार को देख रहा है।