คุณจะระบุตัวอักษรไบต์ใน Java ได้อย่างไร


238

ถ้าฉันมีวิธี

void f(byte b);

ฉันจะเรียกมันด้วยอาร์กิวเมนต์ตัวเลขโดยไม่ต้องทำการคัดเลือกได้อย่างไร?

f(0);

ให้ข้อผิดพลาด


1
@oliholz ​​ที่ใจร้ายกับค่าใช้จ่ายในการแยกวิเคราะห์เพิ่มเติม
Ben Barkay

คำตอบ:


284

คุณไม่สามารถ. ค่าคงที่ตัวเลขพื้นฐานถือเป็นจำนวนเต็ม (หรือยาวถ้าตามด้วย "L") ดังนั้นคุณต้องแปลงค่าลงในไบต์อย่างชัดเจนเพื่อส่งเป็นพารามิเตอร์ เท่าที่ฉันรู้ไม่มีทางลัด


11
หากคุณกำลังทำสิ่งนี้มากมายคุณสามารถกำหนดวิธีใช้ตัวช่วยง่ายๆที่byte b(int i) { return (byte) i; }ใดที่หนึ่งและนำเข้าแบบคงที่ จากนั้นคุณสามารถเขียน f (b (10))
Yona Appletree

125

คุณต้องโยนฉันกลัว:

f((byte)0);

ฉันเชื่อว่าจะทำการแปลงที่เหมาะสมในเวลาคอมไพล์แทนเวลาดำเนินการดังนั้นจึงไม่ทำให้เกิดการลงโทษได้จริง มันไม่สะดวกเพียง :(


11
+1 สำหรับการแปลงเวลาคอมไพล์ เป็นเรื่องธรรมดาถ้าคุณเข้าใจคอมไพเลอร์และมีความเชื่อในนักออกแบบภาษา (ซึ่งเราควร) แต่ก็ไม่ชัดเจน
Philip Guin

31

คุณสามารถใช้ตัวอักษรไบต์ใน Java ... ประเภทของ

    byte f = 0;
    f = 0xa;

0xa(int literal) ถูกแปลงเป็นไบต์โดยอัตโนมัติ มันไม่ใช่ตัวอักษรไบต์ที่แท้จริง (ดู JLS & ความคิดเห็นด้านล่าง) แต่ถ้ามันเหมือนเป็ดฉันจะเรียกมันว่าเป็ด

สิ่งที่คุณทำไม่ได้คือ:

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
สิ่งเหล่านี้ไม่ใช่ตัวอักษรไบต์ มันเป็นตัวอักษรประเภทอื่น ๆ (int, ส่วนใหญ่) ที่ถูกแปลงเป็นไบต์โดยปริยาย เช่น1เป็นตัวอักษร int แต่double d = 1;รวบรวมได้ดี
smehmood

หากคุณใช้ลูกเล่นอยู่แล้ว มีการนำเข้าคงที่ของbyte b(int i){}แล้วเป็นเวลานานและยุ่งยากน้อยกว่าb(1) f=1
Elazar Leibovich

1
@smehmood แต่เนื่องจากการแปลงเสร็จสิ้นโดย pre-compiler / compiler (ก่อนที่โปรแกรมจะเริ่มทำงาน) และไม่ใช่ runtime ดังนั้นมันจึงเป็นตัวอักษรใช่ไหม
Pacerier

2
@Pierier มันเป็นตัวอักษร มันไม่ใช่ "ตัวอักษรไบต์" มันเป็น int คอมไพเลอร์ถือว่ามันเป็นตัวอักษร int (เท่าที่ควร) และทำ downcast โดยนัยในการกำหนด (เท่าที่ควร) จะไม่มีการแยกวิเคราะห์เป็น "ตัวอักษรไบต์" (ซึ่งไม่มีอยู่) ดูส่วน JLS 5.2โดยเฉพาะอย่างยิ่งในช่วงครึ่งหลังที่เกี่ยวกับการแปลงให้แคบลง สิ่งเดียวที่เกี่ยวข้องคือค่าคงที่จำนวนเต็มและการประยุกต์ใช้กฎการแปลงการมอบหมายที่เหมาะสมให้กับตัวแปรไบต์
Jason C

ฉันให้คำตอบนี้ +1 เพราะเทคนิคเป็นนวนิยาย แต่ที่จริงแล้วไม่มี "ตัวอักษรไบต์" ใน Java

12

หากคุณกำลังส่งตัวอักษรเป็นรหัสคุณจะหยุดอะไรจากการประกาศล่วงหน้า

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

1
นอกจากนี้ยังช่วยให้คุณสามารถให้ค่าชื่อความหมายเพิ่มเติม en.wikipedia.org/wiki/…
Aaron J Lang

สิ่งนี้มีประโยชน์ หากคุณกำลังพยายามเติมอาร์เรย์จำนวนหนึ่งโดยใช้วิธีการ 'เติม' ของจาวานี่เป็นวิธีที่สมเหตุสมผลที่สุด

คอมไพเลอร์เพียงแค่บ่นเกี่ยวกับการต่อไปอย่างไรและฉันต้องการที่จะเพิ่มนักแสดง: public static final byte BYTE_MASK = ( byte )0xff;
Marvo

และฉันก็รู้ว่าจริง ๆ แล้วฉันต้องการที่byte BYTE_MASK = 0x000000ff;จะเกรงว่าฉันจะได้รับส่วนขยายสัญญาณที่น่ารังเกียจ
Marvo

5

สิ่งที่เกี่ยวกับการเอาชนะวิธีด้วย

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

สิ่งนี้จะช่วยให้ f(0)


26
-1 สิ่งนี้แย่มากสำหรับการอ่านโค้ด และอาจก่อให้เกิดปัญหาเมื่อผู้คนพยายามส่งผ่านค่าที่สูงกว่าไบต์ได้ ฉันไม่แนะนำให้ผู้อื่นใช้วิธีนี้!
Rolf ツ

3
นอกจากนี้นักแสดงนี้จะเกิดขึ้นในเวลาทำงาน ที่เลวร้ายมาก.
BrainSlugs83

การยอมรับอย่างสมบูรณ์กับ Rolf (Tsu) อาจเป็นสิ่งที่ควรค่าแก่การเพิ่มซึ่งในทางเทคนิคแล้วการบรรทุกเกินพิกัดไม่ใช่การเอาชนะ
Cromax

-2

ด้วย Java 7 และรุ่นที่ใหม่กว่าคุณสามารถระบุตัวอักษรไบต์ด้วยวิธีนี้: byte aByte = (byte)0b00100001;

การอ้างอิง: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html


20
ตัวอักษรไบนารี ! = ไบต์ตามตัวอักษร
Marcello Nuccio

คุณยังคงแคสติ้งเป็นไบต์
M.kazem Akhgary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.