Wenn in arithmetischen Operationen short
automatisch int
hochgestuft wird, warum dann:
short thirty = 10 * 3;
Eine rechtliche Zuordnung zur short
Variablen thirty
?
Dies wiederum:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
so gut wie das:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
wird nicht kompiliert, da das Zuweisen eines int
Werts zu a short
nicht zulässig ist, ohne wie erwartet zu gießen.
Ist bei numerischen Literalen etwas Besonderes los?
java
short
type-promotion
Deckengecko
quelle
quelle
short thirty = 10 * 3;
wird höchstwahrscheinlich durchshort thirty = 30;
den Compiler ersetzt, der dann eine gültige Anweisung ist. (Ich müsste allerdings den entsprechenden JLS-Abschnitt nachschlagen).10 * 3
und initialisiert die Variable mit dem Ergebnis. In Ihrem nicht funktionierenden Beispiel erfolgt die Berechnung zur Laufzeit, wenn die JVM den Kurzschluss umwandelt.final int ten = 10; final int three = 3; short thirty = ten * three;
kompiliert wird.If short is automatically promoted to int in arithmetic operations
- das ist nicht relevant. Weder10
noch3
Shorts noch werden sie befördert, sie sind wörtlich.10
und vom Compiler3
alsint
s ausgewertet werden ?Antworten:
Weil der Compiler
10*3
zur Kompilierungszeit selbst durch 30 ersetzt . Also effektiv:short thirty = 10 * 3
wird zur Kompilierungszeit berechnet.Versuchen Sie,
ten
undthree
zu ändernfinal short
(damit sie Zeitkonstanten kompilieren) und sehen Sie, was passiert: P.Untersuchen Sie den Bytecode mit
javap -v
für beide Überprüfungen (10*3
undfinal short
). Sie werden sehen, dass es kaum einen Unterschied gibt.Ok, hier ist der Bytecode-Unterschied für verschiedene Fälle.
Fall 1 :
Bytecode:
Fall -2:
Bytecode:
Fall -3:
Bytecode:
Im obigen Fall
10
und3
werden aus den lokalen Variablens1
und entnommens2
quelle
Try changing ten and three to final short
Übung :)you will see that there's no difference (between those two lines in the decompiled code)
ist das nicht dein Punkt?case 10*3:
und ähnliches in einem Switch-Konstrukt legal ist.Ja, mit dem wörtlichen Fall ist etwas Besonderes los:
10 * 3
Wird zur Kompilierungszeit ausgewertet . Sie benötigen also keine explizite(short)
Konvertierung für multiplizierte Literale.ten * three
ist zur Kompilierungszeit nicht auswertbar und benötigt daher eine explizite Konvertierung.Es wäre eine andere Sache, wenn
ten
undthree
markiert würdenfinal
.quelle
Die folgende Antwort fügt den JLS-Abschnitt und einige Details zu diesem Verhalten hinzu.
Wie pro JLS §15.2 - Ausdrucksformen
quelle