Si short
se promueve automáticamente a int
en operaciones aritméticas, entonces por qué es:
short thirty = 10 * 3;
¿Una cesión legal a la short
variable thirty
?
A su vez, esto:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
tan bien como esto:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
no se compila porque no se permite asignar un int
valor a a short
sin convertir como se esperaba.
¿Está sucediendo algo especial con los literales numéricos?
java
short
type-promotion
Gecko de techo
fuente
fuente
short thirty = 10 * 3;
Lo más probable es que sea reemplazado porshort thirty = 30;
el compilador, que es una declaración válida. (Sin embargo, tendría que buscar la sección JLS relevante).10 * 3
e inicializa la variable con el resultado. En su ejemplo no funcional, el cálculo ocurre en tiempo de ejecución donde la JVM lanza el corto.final int ten = 10; final int three = 3; short thirty = ten * three;
compila bien.If short is automatically promoted to int in arithmetic operations
- eso no es relevante. Ni10
tampoco3
son cortos ni son promovidos, son literales.10
y el compilador los3
evalúa comoint
s?Respuestas:
Porque el compilador reemplaza
10*3
con 30 en el tiempo de compilación . Entonces, efectivamente:short thirty = 10 * 3
se calcula en tiempo de compilación.Prueba a cambiar
ten
ythree
quefinal short
(por lo que las constantes de tiempo de compilación) y ver lo que sucede: PExamine el uso de código de bytes
javap -v
para ambas versiones (10*3
yfinal short
). Podrás ver que hay poca diferencia.Bien, aquí está la diferencia de código de bytes para diferentes casos.
Caso 1 :
Código de byte:
Caso -2:
Código de byte:
Caso -3:
Código de byte:
En el caso anterior,
10
y3
se toman de las variables localess1
ys2
fuente
Try changing ten and three to final short
ejercicio :)you will see that there's no difference (between those two lines in the decompiled code)
porque ¿no es este tu punto?case 10*3:
y similar es legal en una construcción de interruptor.Sí, hay algo especial en el caso literal:
10 * 3
se evaluará en el momento de la compilación . Por lo tanto, no necesita una(short)
conversión explícita para literales multiplicados.ten * three
no es evaluable en tiempo de compilación, por lo que necesita una conversión explícita.Sería diferente si
ten
ythree
estuvieran marcadosfinal
.fuente
La siguiente respuesta agrega la sección JLS y algunos detalles sobre este comportamiento.
Según JLS §15.2 - Formas de expresiones
fuente