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.


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.


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 :(


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

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);

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)


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.