Si shortse promueve automáticamente a inten operaciones aritméticas, entonces por qué es:
short thirty = 10 * 3;
¿Una cesión legal a la shortvariable 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 intvalor a a shortsin 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 * 3e 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. Ni10tampoco3son cortos ni son promovidos, son literales.10y el compilador los3evalúa comoints?Respuestas:
Porque el compilador reemplaza
10*3con 30 en el tiempo de compilación . Entonces, efectivamente:short thirty = 10 * 3se calcula en tiempo de compilación.Prueba a cambiar
tenythreequefinal 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 -vpara ambas versiones (10*3yfinal 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,
10y3se toman de las variables localess1ys2fuente
Try changing ten and three to final shortejercicio :)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 * 3se evaluará en el momento de la compilación . Por lo tanto, no necesita una(short)conversión explícita para literales multiplicados.ten * threeno es evaluable en tiempo de compilación, por lo que necesita una conversión explícita.Sería diferente si
tenythreeestuvieran 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