Wie geben Sie ein Byte-Literal in Java an?

238

Wenn ich eine Methode habe

void f(byte b);

Wie kann ich es mit einem numerischen Argument ohne Casting aufrufen?

f(0);

gibt einen Fehler.

Charbel
quelle
1
@oliholz, das mit zusätzlichem Parsing-Overhead niedergeschlagen ist
Ben Barkay

Antworten:

284

Du kannst nicht. Eine grundlegende numerische Konstante wird als Ganzzahl betrachtet (oder als lang, wenn ein "L" folgt). Sie müssen sie daher explizit auf ein Byte herabsetzen, um sie als Parameter zu übergeben. Soweit ich weiß, gibt es keine Abkürzung.

Robin
quelle
11
Wenn Sie so etwas häufig tun, können Sie byte b(int i) { return (byte) i; }irgendwo eine einfache Hilfsmethode definieren und statisch importieren. Dann können Sie f (b (10)) schreiben.
Yona Appletree
125

Sie müssen besetzen, ich fürchte:

f((byte)0);

Ich glaube, dass die entsprechende Konvertierung zur Kompilierungszeit anstelle der Ausführungszeit durchgeführt wird, sodass dies keine Leistungseinbußen zur Folge hat. Es ist nur unpraktisch :(

Jon Skeet
quelle
11
+1 für die Konvertierung zur Kompilierungszeit. Es ist normal, wenn Sie beide Compiler verstehen und Vertrauen in Sprachdesigner haben (was wir sollten), aber ansonsten nicht so offensichtlich.
Philip Guin
31

Sie können ein Byte-Literal in Java verwenden ... irgendwie.

    byte f = 0;
    f = 0xa;

0xa(int literal) wird automatisch in Byte umgewandelt. Es ist kein echtes Byte-Literal (siehe JLS & Kommentare unten), aber wenn es wie eine Ente quakt, nenne ich es eine Ente.

Was Sie nicht tun können, ist Folgendes:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile

Sie müssen wie folgt besetzen:

 foo( (byte) 0xa ); 

Beachten Sie jedoch, dass diese alle kompiliert werden und "Byte-Literale" verwenden:

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

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

    foo( f = 1 );  //compiles

Natürlich kompiliert dies auch

    foo( (byte) 1 );  //compiles
RickHigh
quelle
17
Dies sind keine Byte-Literale. Sie sind Literale einer Vielzahl anderer Typen (meistens int), die implizit in ein Byte konvertiert werden. zB 1ist ein int-Literal, double d = 1;kompiliert aber gut.
smehmood
Wenn Sie bereits Tricks anwenden. Habe einen statischen Import von byte b(int i){}, dann b(1)so lange und weniger knifflig als f=1.
Elazar Leibovich
1
@smehmood, aber da die Konvertierung vom Pre-Compiler / Compiler (bevor das Programm überhaupt gestartet wird) und nicht von der Laufzeit durchgeführt wird, handelt es sich um ein Literal, nicht wahr?
Pacerier
2
@ Pacerier Es ist ein Literal. Es ist kein "Byte-Literal". Es ist ein int. Der Compiler behandelt es als int-Literal (wie es sollte) und führt einen impliziten Downcast in der Zuweisung durch (wie es auch sollte). Zu keinem Zeitpunkt wird es als "Byte-Literal" analysiert (das nicht existiert). Siehe JLS Abschnitt 5.2, insbesondere die zweite Hälfte, in Bezug auf die Einschränkung von Conversions. Es geht nur um eine Ganzzahlkonstante und die Anwendung einer geeigneten Zuweisungskonvertierungsregel auf eine Bytevariable.
Jason C
Ich gab diese Antwort +1, weil die Technik neu ist, aber in Java gibt es tatsächlich keine "Byteliterale".
12

Wenn Sie Literale im Code übergeben, was hindert Sie daran, sie einfach im Voraus zu deklarieren?

byte b = 0; //Set to desired value.
f(b);
Mike Yockey
quelle
1
Auf diese Weise können Sie dem Wert auch einen semantischeren Namen geben. en.wikipedia.org/wiki/…
Aaron J Lang
Das ist nützlich. Wenn Sie versuchen, ein Array von Bytes mit der Java-Methode 'fill' zu füllen, ist dies am sinnvollsten.
Der Compiler beschwerte sich jedoch nur über Folgendes und ich musste die Besetzung hinzufügen: public static final byte BYTE_MASK = ( byte )0xff;
Marvo
Und mir wurde klar, dass ich eigentlich wollte, byte BYTE_MASK = 0x000000ff;dass ich keine bösen Fehler bei der Zeichenerweiterung bekomme.
Marvo
5

Was ist mit dem Überschreiben der Methode mit

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

dies wird ermöglichen f(0)

Boris Pavlović
quelle
26
-1 Dies ist sehr schlecht für die Lesbarkeit des Codes. Und könnte Probleme verursachen, wenn Leute tatsächlich versuchen, einen höheren Wert zu übergeben, als das Byte enthalten kann. Ich rate Menschen davon ab, diese Methode anzuwenden!
Rolf
3
Diese Besetzung wird auch zur Laufzeit stattfinden. Sehr schlecht.
BrainSlugs83
Völlig mit Rolf (Tsu) einverstanden, ist es vielleicht erwähnenswert, dass es technisch gesehen überlastet und nicht überschreibt.
Cromax