Làm thế nào để bạn xác định một byte bằng chữ trong Java?


238

Nếu tôi có một phương pháp

void f(byte b);

Làm thế nào tôi có thể gọi nó với một đối số số mà không cần truyền?

f(0);

đưa ra một lỗi.


1
@oliholz ​​điều đó gây thất vọng với việc phân tích cú pháp bổ sung
Ben Barkay

Câu trả lời:


284

Bạn không thể. Một hằng số cơ bản được coi là một số nguyên (hoặc dài nếu được theo sau bởi "L"), do đó bạn phải hạ thấp nó một cách rõ ràng thành một byte để truyền nó dưới dạng tham số. Theo tôi biết không có phím tắt.


11
Nếu bạn đang làm nhiều thứ như vậy, bạn có thể định nghĩa một phương thức trợ giúp đơn giản byte b(int i) { return (byte) i; }ở đâu đó và nhập tĩnh nó. Sau đó, bạn có thể viết f (b (10)).
Yona Appletree

125

Bạn phải phân vai, tôi sợ:

f((byte)0);

Tôi tin rằng sẽ thực hiện chuyển đổi phù hợp vào thời gian biên dịch thay vì thời gian thực hiện , vì vậy nó sẽ không thực sự gây ra các hình phạt về hiệu suất. Thật bất tiện :(


11
+1 để chuyển đổi thời gian biên dịch. Đó là lẽ thường nếu cả hai bạn đều hiểu trình biên dịch và có niềm tin vào các nhà thiết kế ngôn ngữ (mà chúng ta nên), nhưng nếu không thì không rõ ràng lắm.
Philip Guin

31

Bạn có thể sử dụng một byte bằng chữ trong Java ... sắp xếp.

    byte f = 0;
    f = 0xa;

0xa(int chữ) được tự động chuyển thành byte. Nó không phải là một byte thực sự (xem JLS & bình luận bên dưới), nhưng nếu nó giống như một con vịt, tôi gọi nó là một con vịt.

Những gì bạn không thể làm là đây:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Bạn phải chọn như sau:

 foo( (byte) 0xa ); 

Nhưng hãy nhớ rằng tất cả những thứ này sẽ được biên dịch và chúng đang sử dụng "byte byte":

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Tất nhiên điều này cũng biên dịch

    foo( (byte) 1 );  //compiles

17
Đây không phải là byte bằng chữ. Chúng là những chữ có nhiều loại khác nhau (int, chủ yếu) đang được chuyển đổi hoàn toàn thành một byte. ví dụ, 1là một chữ int, nhưng double d = 1;biên dịch tốt.
smehmood

Nếu bạn đã sử dụng thủ thuật. Có một nhập tĩnh byte b(int i){}, sau đó b(1)dài và ít khó khăn hơn f=1.
Elazar Leibovich

1
@smehmood, nhưng vì quá trình chuyển đổi được thực hiện bởi trình biên dịch trước / trình biên dịch (trước khi chương trình thậm chí bắt đầu chạy) và không phải là thời gian chạy, vậy nó có phải là một nghĩa đen không?
Pacerier

2
@Pacerier Đó là một nghĩa đen. Nó không phải là "byte chữ". Nó là một int. Trình biên dịch coi nó như một int intal (như nó nên) và thực hiện một downcast ngầm trong bài tập (vì nó cũng nên). Không có điểm nào được phân tích cú pháp dưới dạng "byte bằng chữ" (không tồn tại). Xem JLS Mục 5.2 cụ thể là nửa sau liên quan đến thu hẹp chuyển đổi. Điều duy nhất liên quan là một hằng số nguyên và việc áp dụng quy tắc chuyển đổi gán thích hợp thành một biến byte.
Jason C

Tôi đã đưa ra câu trả lời +1 này vì kỹ thuật này là tiểu thuyết, nhưng thực sự, không có "byte byte" trong Java.

12

Nếu bạn đang chuyển các ký tự bằng mã, điều gì ngăn bạn đơn giản khai báo trước thời hạn?

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

1
Điều này cũng cho phép bạn cung cấp cho giá trị một tên ngữ nghĩa hơn. vi.wikipedia.org/wiki/ từ
Aaron J Lang

Điều này rất hữu ích. Nếu bạn đang cố gắng lấp đầy một mảng byte bằng phương pháp 'điền' của java, thì điều này là hợp lý nhất.

Trình biên dịch chỉ phàn nàn về những điều sau đây, tuy nhiên, và tôi cần thêm dàn diễn viên: public static final byte BYTE_MASK = ( byte )0xff;
Marvo

Và tôi nhận ra rằng tôi thực sự muốn byte BYTE_MASK = 0x000000ff;kẻo tôi nhận được một số lỗi mở rộng dấu hiệu khó chịu.
Marvo

5

Điều gì về ghi đè phương thức với

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

điều này sẽ cho phép f(0)


26
-1 Điều này rất tệ cho khả năng đọc mã. Và có thể gây ra vấn đề khi mọi người thực sự cố gắng vượt qua trong một giá trị cao hơn byte có thể giữ. Tôi không khuyến khích mọi người sử dụng phương pháp này!
Rolf

3
Ngoài ra, diễn viên này sẽ xảy ra vào thời gian chạy. Rất tệ.
BrainSlugs83

Hoàn toàn đồng ý với Rolf (Tsu), có lẽ đáng để thêm vào, về mặt kỹ thuật, nó quá tải, không bị ghi đè.
Cromax

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.