Soru Java'da bir bayt literalini nasıl belirlersiniz?


Bir yöntemim varsa

void f(byte b);

döküm olmadan sayısal bir argümanla nasıl arayabilirim?

f(0);

bir hata verir.


188
2018-03-04 12:45


Menşei


ek ayrıştırma ek yükü ile downcasting @oliholz - Ben Barkay


Cevaplar:


Yapamazsın. Bir temel sayısal sabit bir tamsayı olarak kabul edilir (ya da bir "L" ile devam ederse uzun), bu nedenle bir parametre olarak iletmek için bir bayta açık bir şekilde yayınlamalısınız. Bildiğim kadarıyla kısayol yoktur.


240
2018-03-04 12:48



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


Korkmalısın, korkarım ki:

f((byte)0);

Uygun dönüşümün gerçekleştirileceğine inanıyorum. derlemek-time yerine icra Zaman, aslında performans cezalarına neden olmaz. Sadece rahatsız edici :(


91
2018-03-04 12:55



Derleme zamanı dönüştürme için +1. Her ikisi de derleyicileri anladığınız ve dil tasarımcılarına (ki bunu yapmalıyız) inancınız varsa, ancak aksi halde çok açık değilse, sağduyuludur. - Philip


Java'da bir bayt literal kullanabilirsiniz ... çeşit.

    byte f = 0;
    f = 0xa;

0xa (int literal) otomatik olarak bayt'a gönderilir. Bu gerçek bir bayt literal değil (aşağıdaki JLS ve yorumları görün), fakat Ördek gibi sallarsa, ona ördek derim.

Yapamadığın şey şudur:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Aşağıdaki gibi yazmalısınız:

 foo( (byte) 0xa ); 

Ancak bunların hepsinin derleneceğini ve "byte literals" kelimelerini kullandıklarını unutmayın:

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Elbette bu da derler

    foo( (byte) 1 );  //compiles

22
2017-10-20 11:02



Bunlar bayt literal değildir. Bunlar, örtülü olarak bir bayta dönüştürülen başka türlerin (int, çoğunlukla) değişmezleridir. Örneğin., 1 bir int literal, ama double d = 1; sadece iyi derler. - smehmood
Zaten hileler kullanıyorsanız. Statik bir ithalat var byte b(int i){}, sonra b(1) daha uzun ve daha az zor f=1. - Elazar Leibovich
@smehmood, Ama dönüştürme öncesi-derleyici / derleyici tarafından yapıldığından (program başlamadan önce bile) ve çalışma zamanı değil, o zaman bir literal değil mi? - Pacerier
@Pacerier Bu bir değişmezdir. Bu bir "byte literal" değil. Bu bir int. Derleyici bunu bir int literal (gerektiği gibi) olarak ele alır ve ödevin örtülü bir downcast'sini (aynı zamanda olması gerektiği gibi) yapar. Hiçbir noktada “byte literal” (var olmayan) olarak ayrıştırılır. Görmek JLS Bölüm 5.2 özellikle ikinci yarıda daralan dönüşümler. İlgili tek şey bir tamsayı sabiti ve bir bayt değişkenine uygun bir atama dönüşüm kuralının uygulanmasıdır. - Jason C
Bu cevabı + 1 verdim çünkü teknik yeni, ama aslında Java'da "byte literals" yok. - vaxquis


Harfleri kod içinde geçiriyorsanız, sizi yalnızca zamanın önünde bildirmekten vazgeçen nedir?

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

8
2018-03-04 12:53



Bu ayrıca, değere daha semantik bir ad vermenizi sağlar. en.wikipedia.org/wiki/... - Aaron J Lang
Bu kullanışlı. Java'nın 'fill' yöntemini kullanarak bir bayt dizisi doldurmaya çalışıyorsanız, bu en mantıklıdır.
Ancak derleyici aşağıdakilerden şikayetçi oldu: public static final byte BYTE_MASK = ( byte )0xff; - Marvo
Ve aslında istediğimi anladım byte BYTE_MASK = 0x000000ff; bazı kötü işaret uzantısı böcekleri alıyorum. - Marvo


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

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

bu izin verecek f(0)


4
2018-03-04 12:50



-1 Bu kod okunabilirliği için çok kötü. Ve insanlar aslında bayt tutabilir daha yüksek bir değer geçmeye çalışırken sorunlara neden olabilir. İnsanları bu yöntemi kullanmamdan vazgeçiriyorum! - Rolf ツ
Ayrıca, bu kadro çalışma zamanında gerçekleşecek. Çok kötü - BrainSlugs83
Tamamen Rolf (Tsu) ile katılıyorum, belki de eklememeye değer, teknik olarak aşırı yükleme, aşırı yükleme değil. - Cromax


Java 7 ve sonraki sürümüyle, bu şekilde bir bayt literal belirtebilirsiniz: byte aByte = (byte)0b00100001;

Referans: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html


-4
2018-05-13 07:14



ikili değişmez! = bayt değişmezi. - Marcello Nuccio