Bagaimana Anda menentukan byte literal di Jawa?


238

Jika saya punya metode

void f(byte b);

bagaimana saya bisa menyebutnya dengan argumen numerik tanpa casting?

f(0);

memberikan kesalahan.


1
@oliholz ​​yang downcasting dengan overhead parsing tambahan
Ben Barkay

Jawaban:


284

Kamu tidak bisa. Konstanta numerik dasar dianggap sebagai bilangan bulat (atau panjang jika diikuti oleh "L"), jadi Anda harus menurunkannya secara eksplisit ke byte untuk meneruskannya sebagai parameter. Sejauh yang saya tahu tidak ada jalan pintas.


11
Jika Anda melakukan banyak hal semacam ini, Anda dapat menentukan metode pembantu sederhana di byte b(int i) { return (byte) i; }suatu tempat dan mengimpornya secara statis. Maka Anda dapat menulis f (b (10)).
Yona Appletree

125

Anda harus memilih, saya khawatir:

f((byte)0);

Saya percaya bahwa akan melakukan konversi yang sesuai pada waktu kompilasi alih-alih waktu eksekusi , jadi itu tidak benar-benar akan menyebabkan hukuman kinerja. Itu hanya nyaman :(


11
+1 untuk konversi waktu kompilasi. Masuk akal jika Anda berdua memahami kompiler dan memiliki kepercayaan pada perancang bahasa (yang seharusnya), tetapi sebaliknya tidak begitu jelas.
Philip Guin

31

Anda dapat menggunakan byte literal di Java ... semacam.

    byte f = 0;
    f = 0xa;

0xa(int literal) secara otomatis dilemparkan ke byte. Ini bukan byte sebenarnya (lihat JLS & komentar di bawah), tetapi jika itu seperti bebek, saya menyebutnya bebek.

Yang tidak bisa Anda lakukan adalah ini:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Anda harus berperan sebagai berikut:

 foo( (byte) 0xa ); 

Tetapi perlu diingat bahwa ini semua akan dikompilasi, dan mereka menggunakan "byte literal":

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Tentu saja ini mengkompilasi juga

    foo( (byte) 1 );  //compiles

17
Ini bukan byte literal. Mereka adalah literal dari berbagai jenis lain (int, kebanyakan) yang secara implisit dikonversi ke byte. misalnya, 1adalah int literal, tetapi double d = 1;kompilasi dengan baik.
smehmood

Jika Anda sudah menggunakan trik. Memiliki impor statis byte b(int i){}, maka b(1)selama dan kurang rumit daripada f=1.
Elazar Leibovich

1
@smehmood, Tapi karena konversi dilakukan oleh pre-compiler / compiler (bahkan sebelum program mulai berjalan) dan bukan runtime, maka itu adalah literal bukan?
Pacerier

2
@Pacerier Ini literal. Ini bukan "byte literal". Itu adalah int. Compiler memperlakukannya sebagai int literal (sebagaimana mestinya) dan melakukan downcast implisit dalam penugasan (sebagaimana juga seharusnya). Tidak ada titik diuraikan sebagai "byte literal" (yang tidak ada). Lihat JLS Bagian 5.2 khususnya pada paruh kedua tentang penyempitan konversi. Satu-satunya hal yang terlibat adalah konstanta integer dan penerapan aturan konversi penugasan yang sesuai ke variabel byte.
Jason C

Saya memberi jawaban ini +1 karena tekniknya baru, tetapi memang, tidak ada "byte literal" di Jawa.

12

Jika Anda memasukkan literal dalam kode, apa yang menghentikan Anda dari hanya menyatakannya sebelumnya?

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

1
Ini juga memungkinkan Anda memberi nilai nama yang lebih semantik. en.wikipedia.org/wiki/…
Aaron J Lang

Ini bermanfaat. Jika Anda mencoba mengisi array byte menggunakan metode java 'fill', ini paling masuk akal.

Kompilator hanya mengeluh tentang hal berikut, dan saya perlu menambahkan para pemain: public static final byte BYTE_MASK = ( byte )0xff;
Marvo

Dan saya menyadari bahwa saya benar-benar ingin byte BYTE_MASK = 0x000000ff;agar saya mendapatkan beberapa bug ekstensi tanda buruk.
Marvo

5

Bagaimana dengan mengganti metode dengan

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

ini akan memungkinkan f(0)


26
-1 Ini sangat buruk untuk keterbacaan kode. Dan dapat menyebabkan masalah ketika orang benar-benar mencoba untuk meneruskan nilai yang lebih tinggi daripada yang bisa dimiliki oleh byte. Saya mencegah orang menggunakan metode ini!
Rolf ツ

3
Juga, para pemain ini akan terjadi pada saat run-time. Sangat buruk.
BrainSlugs83

Sepenuhnya setuju dengan Rolf (Tsu), mungkin perlu ditambahkan, bahwa secara teknis itu overloading, bukan overriding.
Cromax

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.