2015-05-20 17 views
24

मैं चार कास्टिंग का परीक्षण किया गया है बाइट के लिए चार और मैं इस माध्यम से चला गया: कारण है कि यह 1 में ठीक काम कर रहा है जब मैं बाइट के लिए एक अंतिम जोड़ाजावा कास्टिंग

public class Test { 
    public static void main(String a[]) { 
     final byte b1 = 1; 
     byte b2 = 1; 
     char c = 2; 

     c = b1; // 1- Working fine 
     c = b2; // 2 -Compilation error 
    } 
} 

किसी को भी व्याख्या कर सकते हैं?

+0

सामान्य रूप से, बाइट्स से वर्णों तक कास्टिंग और इसके विपरीत एक अच्छा अभ्यास नहीं है क्योंकि यह एन्कोडिंग को अनदेखा करता है। – Necreaux

उत्तर

18

जब चर final है, संकलक स्वचालित रूप से inlines जो 1. है अपने मूल्य यह मान char के रूप में प्रदर्शनीय है, अर्थात्:

c = b1; 

c = 1; 

वास्तव में करने के लिए बराबर है, this section on final variables के अनुसार, b1 को निरंतर माना जाता है:

आदिम प्रकार का एक चर या String टाइप करें, जो final है और संकलन-समय निरंतर अभिव्यक्ति (§15.28) के साथ प्रारंभ किया गया है, को स्थिर चर कहा जाता है।

+2

अभी भी कोई फर्क नहीं पड़ता – loonytune

+3

@loonytune हाँ संकलक यह करता है। 'Javac 1.7.0_75' का उपयोग करके सत्यापित किया गया। – manouti

+1

आप जावा 8 पर भी सही हैं, सत्यापित हैं। मैं वास्तव में हैरान हूं, शायद यह कुछ ऐसा करने के साथ है जो संकलन के दौरान प्रतीक तालिका में निरंतर प्रविष्टि है और बिल्कुल वैरिएबल नहीं है। इसके लिए खेद है, आपकी टिप्पणी और उत्तर उभरा ... – loonytune

0

ठीक है, इसकी वजह से बाइट एक हस्ताक्षरित प्रकार, जबकि चार, नहीं है तो यू के लिए स्पष्ट प्रकार रूपांतरण लागू करने की आवश्यकता है (2)

c = (char)b2; 

भी अंतिम बयान क्योंकि संकलन करने से पहले 1 के लिए काम किया , कंपाइलर यह पुष्टि करने में सक्षम है कि रूपांतरण के कारण कोई नुकसान नहीं है क्योंकि '1' चार की सीमा में है, उसी -11 में एक ही अंतिम कथन के साथ '-1' डालने का प्रयास करें, आपको फिर से संकलन त्रुटि मिल जाएगी।

यह सब के बीच प्रकार अनुकूलता करने पर निर्भर करता हस्ताक्षर किए और अहस्ताक्षरित types..which जावा में स्पष्ट रूप से किया जाना चाहिए।

10

byte से char का रूपांतरण जावा भाषा विशिष्टता के paragraph 5.1.4 में वर्णित अनुसार एक व्यापक और संकुचित आदिम रूपांतरण है।

के रूप में JLS का वर्णन करता है, यह एक मध्यवर्ती चरण के माध्यम से किया जाता है; byte को int में एक चौड़े आदिम रूपांतरण के माध्यम से परिवर्तित किया गया है और फिर int को char में एक संकीर्ण आदिम रूपांतरण के माध्यम से परिवर्तित किया गया है (5.1.3 देखें)।

Paragraph 5.2 बताते हैं जब एक डाली आवश्यक है जब आप एक काम करें:

... अगर अभिव्यक्ति प्रकार byte, short के निरंतर अभिव्यक्ति (§15.28) है, char, या int:

  • एक संकुचन आदिम रूपांतरण यदि चर के प्रकार byte है इस्तेमाल किया जा सकता, short, या char, और निरंतर अभिव्यक्ति का मान चर के प्रकार में प्रतिनिधित्व योग्य है।

आपका चर b1 वास्तव में एक स्थिर है, लेकिन अपने चर b2 नहीं है, इसलिए इस नियम b1 के लिए लेकिन b2 के लिए नहीं लागू होता है।

तो: क्या आप c को b1 असाइन कर सकते हैं क्योंकि b1, एक निरंतर और निरंतर, 1 का मूल्य है एक char में फिट बैठता है, लेकिन आप एक डाली बिना c को b2 असाइन नहीं कर सकते क्योंकि b2 एक निरंतर नहीं है।

+0

तो ... बहुत ... जटिलता ... –

+0

@PaulDraper ठीक है, ये भाषा विनिर्देश से केवल आधिकारिक नियम हैं, जो बताते हैं कि एक क्यों काम करता है और दूसरा एक त्रुटि है। अंत में आपको याद रखना होगा कि यदि यह स्थिर है तो आपको कास्ट करने की आवश्यकता नहीं है। उस मामले में आपको डालने की वजह क्यों नहीं है। – Jesper

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