Java'da bir bayt değişmez değerini nasıl belirtirsiniz?


238

Bir yöntemim varsa

void f(byte b);

Döküm yapmadan sayısal bir argümanla nasıl arayabilirim?

f(0);

hata veriyor.


1
@oliholz ​​ek ayrıştırma yükü ile
indiriyor

Yanıtlar:


284

Yapamazsın. Temel bir sayısal sabit bir tamsayı olarak kabul edilir (ya da bir "L" ile uzunsa), bu nedenle parametre olarak iletmek için onu bir bayta açık şekilde indirmelisiniz. Bildiğim kadarıyla kısayol yok.


11
Bu tür bir çok şey yapıyorsanız, bir byte b(int i) { return (byte) i; }yerde basit bir yardımcı yöntem tanımlayabilir ve statik olarak içe aktarabilirsiniz. Sonra f (b (10)) yazabilirsiniz.
Yona Appletree

125

Korkmalısın, korkarım:

f((byte)0);

Bunun derleme- zamanında yürütme zamanı yerine uygun dönüşümü gerçekleştireceğine inanıyorum , bu yüzden aslında performans cezalarına neden olmayacak. Bu sadece elverişsiz :(


11
Derleme zamanı dönüşümü için +1. Hem derleyicileri anlarsanız hem de dil tasarımcılarına inanırsanız (ki biz yapmamız gerekir) sağduyu, ancak aksi halde çok açık değil.
Philip Guin

31

Java'da bir bayt değişmezi kullanabilirsiniz ... tür.

    byte f = 0;
    f = 0xa;

0xa(int literal) otomatik olarak bayta alınır. Bu gerçek bir bayt değişmez değil (bkz. JLS & yorumlar aşağıdaki), ama bir ördek gibi quacks, ben bir ördek diyorum.

Yapamayacağınız şey şudur:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Aşağıdaki gibi döküm yapmalısınız:

 foo( (byte) 0xa ); 

Ancak bunların hepsinin derleneceğini ve "bayt değişmez değerleri" kullandığını unutmayın:

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Tabii ki bu da

    foo( (byte) 1 );  //compiles

17
Bunlar bayt değişmez değerleri değildir. Bunlar dolaylı olarak bir bayta dönüştürülen çeşitli diğer türlerin (int, çoğunlukla) değişmez değerleridir. örneğin, 1int interal, ama double d = 1;derli toplu.
smehmood

Zaten hile kullanıyorsanız. Statik bir ithalata sahip olun byte b(int i){}, sonra b(1)daha uzun ve daha az zor f=1.
Elazar Leibovich

1
@smehmood, Ama dönüşüm ön-derleyici / derleyici tarafından yapıldığından (program çalışmaya başlamadan önce) ve çalışma zamanı değil, o zaman tam anlamıyla değil mi?
Pacerier

2
@Pacerier Bu bir değişmez. Bu bir "bayt değişmez değeri" değildir. Bir int. Derleyici bunu bir interal olarak değerlendirir (olması gerektiği gibi) ve ödevde örtük bir downcast yapar (olması gerektiği gibi). Hiçbir noktada bir "bayt değişmez değeri" olarak ayrıştırılmaz (mevcut değildir). Dönüşümlerin daraltılması ile ilgili olarak özellikle JLS Bölüm 5.2'ye bakınız . İlgili tek şey bir tamsayı sabiti ve uygun bir atama dönüştürme kuralının bayt değişkenine uygulanmasıdır.
Jason C

Bu cevabı +1 olarak verdim çünkü teknik yeni, ama gerçekten de Java'da "bayt değişmez değeri" yok.

12

Değişmezleri kod içinde geçiriyorsanız, bunu önceden bildirmekten alıkoyan şey nedir?

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

1
Bu, değere daha semantik bir ad vermenizi sağlar. en.wikipedia.org/wiki/…
Aaron J Lang

Bu kullanışlı. Java'nın 'dolgu' yöntemini kullanarak bir bayt dizisini doldurmaya çalışıyorsanız, bu en mantıklıdır.

Derleyici, ancak aşağıdakilerden şikayetçi oldu ve oyuncu kadrosunu eklemem gerekiyordu: public static final byte BYTE_MASK = ( byte )0xff;
Marvo

Ve aslında byte BYTE_MASK = 0x000000ff;bazı kötü işaret uzantısı hataları almak istemiyorum fark etti .
Marvo

5

Yöntemi geçersiz kılmaya ne dersiniz?

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

bu izin verecek f(0)


26
-1 Bu kod okunabilirliği açısından çok kötü. Ve insanlar aslında baytın tutabileceğinden daha yüksek bir değerde geçmeye çalıştıklarında sorunlara neden olabilirler. İnsanları bu yöntemi kullanmaktan caydırıyorum!
Rolf ツ

3
Ayrıca, bu oyuncu çalışma zamanında gerçekleşecek. Çok kötü.
Mayıs 15:34

Rolf (Tsu) ile tamamen katılıyorum, belki de teknik olarak aşırı yüklendiğini, geçersiz kılmadığını eklemeye değer.
Cromax

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.