आप जावा में बाइट शाब्दिक कैसे निर्दिष्ट करते हैं?


238

अगर मेरे पास एक तरीका है

void f(byte b);

बिना कास्टिंग के मैं इसे एक संख्यात्मक तर्क के साथ कैसे कह सकता हूं?

f(0);

एक त्रुटि देता है।


1
@oliholz ​​अतिरिक्त पार्सिंग ओवरहेड के साथ डाउनकास्टिंग कर रहा है
बेन बार्क

जवाबों:


284

आप नहीं कर सकते। एक बुनियादी संख्यात्मक स्थिरांक को एक पूर्णांक माना जाता है (या यदि "L" द्वारा अनुसरण किया जाता है), तो आपको इसे एक पैरामीटर के रूप में पारित करने के लिए इसे बाइट के लिए स्पष्ट रूप से डाउनकास्ट करना होगा। जहां तक ​​मुझे पता है कि कोई शॉर्टकट नहीं है।


11
यदि आप इस तरह की बहुत सारी चीजें कर रहे हैं, तो आप byte b(int i) { return (byte) i; }कहीं पर एक सरल सहायक विधि को परिभाषित कर सकते हैं और इसे सांख्यिकीय रूप से आयात कर सकते हैं। तब आप f (b (10)) लिख सकते हैं।
योना एप्लेट्री

125

आपको कास्ट करना है, मुझे डर है:

f((byte)0);

मेरा मानना ​​है कि निष्पादन समय के बजाय संकलन- समय पर उचित रूपांतरण करेगा , इसलिए यह वास्तव में प्रदर्शन दंड का कारण नहीं होगा। यह सिर्फ असुविधाजनक है :(


11
संकलन-समय रूपांतरण के लिए +1। यह सामान्य ज्ञान है यदि आप दोनों ही कम्पाइलर को समझते हैं और भाषा डिजाइनरों (जो हमें चाहिए) में विश्वास है, लेकिन अन्यथा इतना स्पष्ट नहीं है।
फिलिप गिनी

31

आप जावा में एक बाइट शाब्दिक ... का उपयोग कर सकते हैं।

    byte f = 0;
    f = 0xa;

0xa(int शाब्दिक) स्वचालित रूप से बाइट के लिए डाली जाती है। यह एक वास्तविक बाइट शाब्दिक नहीं है (नीचे देखें जेएलएस और टिप्पणियां), लेकिन अगर यह एक बतख की तरह बंद हो जाता है, तो मैं इसे बतख कहता हूं।

आप यह नहीं कर सकते:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

आपको निम्नानुसार डालना होगा:

 foo( (byte) 0xa ); 

लेकिन ध्यान रखें कि ये सभी संकलन करेंगे, और वे "बाइट शाब्दिक" का उपयोग कर रहे हैं:

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

    foo( f = 'a' ); //compiles

    foo( f = 1 );  //compiles

बेशक यह संकलन भी

    foo( (byte) 1 );  //compiles

17
ये बाइट शाब्दिक नहीं हैं। वे विभिन्न प्रकार के विभिन्न प्रकार के शाब्दिक हैं (उदाहरण के लिए, ज्यादातर) जिन्हें एक बाइट में बदल दिया जा रहा है। उदाहरण के लिए, 1एक अंतर शाब्दिक है, लेकिन double d = 1;ठीक संकलन करता है।
smehmood

यदि आप पहले से ही ट्रिक्स का उपयोग कर रहे हैं। का स्थैतिक आयात करें byte b(int i){}, फिर b(1)जितना लंबा और उससे कम मुश्किल हो f=1
एलाजार लीबोविच

1
@smehmood, लेकिन जब से रूपांतरण पूर्व-संकलक / संकलक द्वारा किया जाता है (कार्यक्रम शुरू होने से पहले भी) और रनटाइम नहीं है, तो यह एक शाब्दिक है?
3

2
@ स्पेसर यह एक शाब्दिक है। यह एक "बाइट शाब्दिक" नहीं है। यह एक इंट है। संकलक इसे एक आंतरिक शाब्दिक के रूप में मानता है (जैसा कि इसे होना चाहिए) और असाइनमेंट में निहित डाउनकास्ट करता है (जैसा कि यह होना चाहिए)। किसी भी बिंदु पर इसे "बाइट शाब्दिक" (जिसका कोई अस्तित्व नहीं है) के रूप में जाना जाता है। विशेष रूप से बाद के रूपांतरणों के विषय में JLS खंड 5.2 देखें । केवल शामिल चीजें एक पूर्णांक स्थिरांक हैं और बाइट चर के लिए एक उपयुक्त असाइनमेंट रूपांतरण नियम का अनुप्रयोग।
जेसन सी

मैंने यह उत्तर +1 दिया क्योंकि तकनीक उपन्यास है, लेकिन वास्तव में, जावा में कोई "बाइट शाब्दिक" नहीं है।

12

यदि आप कोड में शाब्दिक रूप से उत्तीर्ण कर रहे हैं, तो आपको समय से पहले घोषित करने से क्या रोक रहा है?

byte b = 0; //Set to desired value.
f(b);

1
यह आपको मूल्य को अधिक अर्थ नाम देने की अनुमति देता है। en.wikipedia.org/wiki/…
हारून जे लैंग

यह उपयोगी है। यदि आप जावा की 'फिल' विधि का उपयोग करके बाइट्स की एक सरणी भरने की कोशिश कर रहे हैं, तो यह सबसे समझदार है।

कंपाइलर ने केवल निम्नलिखित के बारे में शिकायत की, हालांकि, और मुझे कलाकारों को जोड़ने की जरूरत थी: public static final byte BYTE_MASK = ( byte )0xff;
मार्वो जूल 27'12 को 7:45

और मुझे एहसास हुआ कि मुझे वास्तव में byte BYTE_MASK = 0x000000ff;ऐसा लगता है कि मुझे कुछ बुरा संकेत एक्सटेंशन कीड़े मिले।
Marvo

5

विधि के साथ ओवरराइड करने के बारे में क्या

void f(int value)
{
  f((byte)value);
}

यह अनुमति देगा f(0)


26
-1 कोड पठनीयता के लिए यह बहुत बुरा है। और समस्याओं का कारण बन सकता है जब लोग वास्तव में बाइट से अधिक मूल्य में पारित करने का प्रयास कर सकते हैं। मैं इस विधि का उपयोग करने से लोगों को हतोत्साहित करता हूं!
रॉल्फ R

3
साथ ही, यह कास्ट रन-टाइम पर होगी। बहुत बुरा।
BrainSlugs83

रॉल्फ (त्सू) के साथ पूरी तरह से सहमत, यह शायद जोड़ने लायक है, कि तकनीकी रूप से यह अतिभारित है, ओवरराइडिंग नहीं।
सेक्रॉन

-2

जावा 7 और बाद के संस्करण के साथ, आप इस तरह से एक बाइट शाब्दिक निर्दिष्ट कर सकते हैं: byte aByte = (byte)0b00100001;

संदर्भ: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html


20
बाइनरी शाब्दिक! = बाइट शाब्दिक।
मार्सेलो नूको

आप अभी भी बाइट के लिए तैयार हैं।
एम। केज़म अखगीरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.