@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.
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 :(
+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.
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?
-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
-2
Dengan Java 7 dan versi yang lebih baru, Anda dapat menentukan byte literal dengan cara ini:
byte aByte = (byte)0b00100001;
Jawaban:
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.
sumber
byte b(int i) { return (byte) i; }
suatu tempat dan mengimpornya secara statis. Maka Anda dapat menulis f (b (10)).Anda harus memilih, saya khawatir:
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 :(
sumber
Anda dapat menggunakan byte literal di Java ... semacam.
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:
Anda harus berperan sebagai berikut:
Tetapi perlu diingat bahwa ini semua akan dikompilasi, dan mereka menggunakan "byte literal":
Tentu saja ini mengkompilasi juga
sumber
1
adalah int literal, tetapidouble d = 1;
kompilasi dengan baik.byte b(int i){}
, makab(1)
selama dan kurang rumit daripadaf=1
.Jika Anda memasukkan literal dalam kode, apa yang menghentikan Anda dari hanya menyatakannya sebelumnya?
sumber
public static final byte BYTE_MASK = ( byte )0xff;
byte BYTE_MASK = 0x000000ff;
agar saya mendapatkan beberapa bug ekstensi tanda buruk.Bagaimana dengan mengganti metode dengan
ini akan memungkinkan
f(0)
sumber
Dengan Java 7 dan versi yang lebih baru, Anda dapat menentukan byte literal dengan cara ini:
byte aByte = (byte)0b00100001;
Referensi: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html
sumber