Kurzwert-Java einstellen

114

Ich schreibe einen kleinen Code in J2ME. Ich habe eine Klasse mit einer Methode setTableId(Short tableId). Wenn ich jetzt versuche zu schreiben setTableId(100), gibt es einen Fehler bei der Kompilierung. Wie kann ich den Short-Wert einstellen, ohne eine andere Short-Variable zu deklarieren?

Beim Einstellen des LongWertes kann ich verwenden setLongValue(100L)und es funktioniert. Also, was Lbedeutet hier und was ist der Charakter für ShortWert?

Vielen Dank

Mubashar
quelle
List nur ein Suffix, das ein longLiteral angibt .
fehlender Faktor

Antworten:

174

In Java sind Ganzzahlliterale standardmäßig vom Typ int. Für einige andere Arten, können Sie die wörtliche mit Groß- und Kleinschreibung Buchstaben wie Suffix L, D, Feine lange, Doppel-, oder Schwimmer zu spezifizieren sind. Beachten Sie, dass es zur besseren Lesbarkeit üblich ist, Großbuchstaben zu verwenden.

Die Java-Sprachspezifikation bietet nicht den gleichen syntaktischen Zucker für Byte- oder Kurztypen. Stattdessen können Sie es mit explizitem Casting als solches deklarieren:

byte foo = (byte)0;
short bar = (short)0;

In Ihrem setLongValue(100L)Methodenaufruf müssen Sie nicht unbedingt das LSuffix einfügen, da in diesem Fall das int-Literal automatisch auf ein langes erweitert wird. Dies wird in der Java-Sprachspezifikation als Erweiterung der primitiven Konvertierung bezeichnet.

Lauri
quelle
16
Es gibt auch Suffixe für andere Typen: d/ Dmacht ein doubleund f/ Fmacht ein Float!
Joachim Sauer
6
Außerdem müssen Literale, die in die Größe passen, nicht gegossen werden. Ihre beiden Beispiele funktionieren auch ohne Besetzung.
Joachim Sauer
Sie haben Recht mit beiden. Ich hätte klarer sagen sollen, dass ich hier von ganzzahligen Literalen spreche, nicht von Gleitkomma-Literalen.
Lauri
4
@ Joachim: Keine Besetzung nur für J5 + erforderlich; J2ME ist leider immer noch bei J4 (ein ernsthaft abgespeckter J4).
Lawrence Dol
2
@ JoachimSauer, was bedeutet "in die Größe passen"? Ich frage , weil ich gerade gesagt werfen musste 0als (short)0eine bekommen um possible lossy conversion from int to shortFehler, auch wenn 0 ein kurz ist.
Ryvantage
34

Es gibt kein Byte oder kurzes Literal. Sie müssen zu kurz mit verwenden(short)100

er4z0r
quelle
9

Im Allgemeinen können Sie die Variable einfach in a umwandeln short.

Sie können auch solche Probleme bekommen, die verwirrend sein können. Dies liegt daran, dass der +Bediener sie zu einem befördertint

Geben Sie hier die Bildbeschreibung ein

Das Casting der Elemente hilft nicht:

Geben Sie hier die Bildbeschreibung ein

Sie müssen den Ausdruck umwandeln:

Geben Sie hier die Bildbeschreibung ein

matte Verbrennungen
quelle
1
Vergiss nicht, dass es einen Grund gibt, warum short + short = int. Wenn die Summe von zwei Kurzschlüssen höher ist als der maximale Kurzwert der Maschine, führt ein Kurzschluss entweder zu unerwarteten Ergebnissen oder löst eine Ausnahme aus, wenn dies von der Sprache unterstützt wird.
DGoiko
2
Mit dieser Logik würde das Hinzufügen von zwei Ints einen langen Wert ergeben;)
Matt brennt
1
Und ich suche danach, wenn meine Summen Integer.MAX_VALUE übertreffen können. Ich verteidige nicht die Entscheidung, int zurückzugeben (was wahrscheinlich mit der Art und Weise zusammenhängt, wie die HW die Summen tatsächlich ausführt). Ich sage nur, dass die Leute bestätigen sollten, dass das Ergebnis tatsächlich kurz ausfüllt, bevor sie es dort ablegen. Ich habe mehr Fehler festgestellt, die die Kapazität verkürzen, als auch int, wahrscheinlich aufgrund der Größe der beteiligten Zahlen. 2 winzige Bytes Java-Reservierer für kurzes Cap-Up sehr schnell
DGoiko
1
Ich habe meinen Kommentar noch einmal gelesen und meinen Standpunkt nicht klargestellt. Der erste Satz ist verwirrend und ich hätte das nicht sagen sollen und den Rest einfach verlassen, es sieht so aus, als ob es zwei verwandte Aussagen gibt. Der Grund für short + short being int kann hier gelesen werden: docs.oracle.com/javase/specs/ jvms / se8 / html /… gibt es in JVM keine kurzen Summenoperationen. Javas int ist 32 Bit, und als diese Entscheidungen getroffen wurden, waren die meisten Computer 32 Bit, also sah int wie die beste Idee aus, denke ich.
DGoiko
1
Beachten Sie auch, dass JVM , wie hier unter stackoverflow.com/a/27123302/9465588 erläutert , mindestens 32 Bit seines virtuellen Speicherplatzes pro Klassenfeld durchlaufen hat, sodass durch das Deklarieren kurzer Felder überhaupt kein Speicherplatz gespart wird. Ich weiß nicht, ob Java dies geändert hat. Ich neige dazu, niemals kurze Werte zu verwenden, es sei denn, es handelt sich um eine externe Einschränkung, wie in einem DAO
DGoiko
8

Sie können verwenden setTableId((short)100). Ich denke, dies wurde in Java 5 geändert, sodass numerische Literale, die Byte oder Kurzschluss zugewiesen sind und sich innerhalb des Bereichs für das Ziel befinden, automatisch als Zieltyp angenommen werden. Die neuesten J2ME-JVMs sind jedoch von Java 4 abgeleitet.

Lawrence Dol
quelle
PS: Willkommen bei den im Mittelalter festgefahrenen Schmerzen beim Codieren für J2ME. Ich kann es kaum erwarten, dass Handheld-Geräte Desktops des Jahres 2000 einholen.
Lawrence Dol
3
Es gibt kein "J4" (und kein "J5". Bitte machen Sie das Java-Versions- / Namensschema nicht verwirrender als es bereits ist.
Joachim Sauer
2
@ Joachim: Java 1, Java 2, Java 5, Java 6 und Java 7 sind bekannt und werden so bezeichnet. Es ist nicht allzu schwer zu extrapolieren, was mit Java 3 und Java 4 gemeint wäre. "Jn" ist einfach eine Abkürzung für das Offensichtliche. Die Übernahme der aktuellen (und hoffentlich endgültigen) Nomenklatur von Sun für alle Versionen verringert die Verwirrung.
Lawrence Dol
2
@ Joachim: Nach Suns letztem Wort zu diesem Thema ist die führende "1". von Java "1.x" ist so zu behandeln, als wäre es niemals vorhanden, wenn auf Versionen in der Diskussion verwiesen wird, und wird in der von JVMs ausgegebenen Version nur aus Kompatibilitätsgründen beibehalten. Daher ist Java 2 die Version, die zuvor als 1.2 bekannt war und von der J2SE ursprünglich stammte (Sie werden feststellen, dass Sun gleichzeitig empfohlen hat, nicht mehr J2xE, sondern JavaEE, JavaSE und JavaME zu verwenden). Daraus folgt, dass 1.3 Java 3 ist, 1.4 Java 4 ist, 1.5 Java 5 ist, 1.6 Java 6 ist und 1.7 Java 7 ist. Im Ernst, das ist nicht so schwer zu begründen.
Lawrence Dol
2
Die "1." wurde nur in Java 5 und höher abgeschnitten. Java 1.0-1.4 wird von Sun immer mit diesem Namen bezeichnet. Und das geschieht absichtlich, weil Sun "Java 2" verwendet hat, um auf Java 1.2 bis Java 1.5 / Java 5 zu verweisen. Es ist sehr verwirrend, aber neue Namen zu erfinden, die Sun nie verwendet hat, macht es nicht einfacher.
Joachim Sauer