@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.
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 :(
+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.
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?
-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
-2
Mit Java 7 und einer höheren Version können Sie ein Byte-Literal folgendermaßen angeben:
byte aByte = (byte)0b00100001;
Antworten:
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.
quelle
byte b(int i) { return (byte) i; }
irgendwo eine einfache Hilfsmethode definieren und statisch importieren. Dann können Sie f (b (10)) schreiben.Sie müssen besetzen, ich fürchte:
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 :(
quelle
Sie können ein Byte-Literal in Java verwenden ... irgendwie.
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:
Sie müssen wie folgt besetzen:
Beachten Sie jedoch, dass diese alle kompiliert werden und "Byte-Literale" verwenden:
Natürlich kompiliert dies auch
quelle
1
ist ein int-Literal,double d = 1;
kompiliert aber gut.byte b(int i){}
, dannb(1)
so lange und weniger knifflig alsf=1
.Wenn Sie Literale im Code übergeben, was hindert Sie daran, sie einfach im Voraus zu deklarieren?
quelle
public static final byte BYTE_MASK = ( byte )0xff;
byte BYTE_MASK = 0x000000ff;
dass ich keine bösen Fehler bei der Zeichenerweiterung bekomme.Was ist mit dem Überschreiben der Methode mit
dies wird ermöglichen
f(0)
quelle
Mit Java 7 und einer höheren Version können Sie ein Byte-Literal folgendermaßen angeben:
byte aByte = (byte)0b00100001;
Referenz: http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html
quelle