ถ้าฉันมีวิธี
void f(byte b);
ฉันจะเรียกมันด้วยอาร์กิวเมนต์ตัวเลขโดยไม่ต้องทำการคัดเลือกได้อย่างไร?
f(0);
ให้ข้อผิดพลาด
ถ้าฉันมีวิธี
void f(byte b);
ฉันจะเรียกมันด้วยอาร์กิวเมนต์ตัวเลขโดยไม่ต้องทำการคัดเลือกได้อย่างไร?
f(0);
ให้ข้อผิดพลาด
คำตอบ:
คุณไม่สามารถ. ค่าคงที่ตัวเลขพื้นฐานถือเป็นจำนวนเต็ม (หรือยาวถ้าตามด้วย "L") ดังนั้นคุณต้องแปลงค่าลงในไบต์อย่างชัดเจนเพื่อส่งเป็นพารามิเตอร์ เท่าที่ฉันรู้ไม่มีทางลัด
byte b(int i) { return (byte) i; }
ใดที่หนึ่งและนำเข้าแบบคงที่ จากนั้นคุณสามารถเขียน f (b (10))
คุณต้องโยนฉันกลัว:
f((byte)0);
ฉันเชื่อว่าจะทำการแปลงที่เหมาะสมในเวลาคอมไพล์แทนเวลาดำเนินการดังนั้นจึงไม่ทำให้เกิดการลงโทษได้จริง มันไม่สะดวกเพียง :(
คุณสามารถใช้ตัวอักษรไบต์ใน 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
1
เป็นตัวอักษร int แต่double d = 1;
รวบรวมได้ดี
byte b(int i){}
แล้วเป็นเวลานานและยุ่งยากน้อยกว่าb(1)
f=1
หากคุณกำลังส่งตัวอักษรเป็นรหัสคุณจะหยุดอะไรจากการประกาศล่วงหน้า
byte b = 0; //Set to desired value.
f(b);
public static final byte BYTE_MASK = ( byte )0xff;
byte BYTE_MASK = 0x000000ff;
จะเกรงว่าฉันจะได้รับส่วนขยายสัญญาณที่น่ารังเกียจ
สิ่งที่เกี่ยวกับการเอาชนะวิธีด้วย
void f(int value)
{
f((byte)value);
}
สิ่งนี้จะช่วยให้ f(0)
ด้วย Java 7 และรุ่นที่ใหม่กว่าคุณสามารถระบุตัวอักษรไบต์ด้วยวิธีนี้:
byte aByte = (byte)0b00100001;
การอ้างอิง: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html