Se short
for automaticamente promovido a int
em operações aritméticas, então por que:
short thirty = 10 * 3;
Uma atribuição legal para a short
variável thirty
?
Por sua vez, este:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
assim como isso:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
não compila porque atribuir um int
valor a a short
não é permitido sem a projeção conforme o esperado.
Há algo especial acontecendo com os literais numéricos?
java
short
type-promotion
Gecko de teto
fonte
fonte
short thirty = 10 * 3;
é provavelmente substituído peloshort thirty = 30;
compilador, que é uma instrução válida. (Eu teria que procurar a seção JLS relevante).10 * 3
e inicializa a variável com o resultado. Em seu exemplo não funcional, o cálculo acontece no tempo de execução onde a JVM converte o curto.final int ten = 10; final int three = 3; short thirty = ten * three;
compila bem.If short is automatically promoted to int in arithmetic operations
- isso não é relevante. Nem10
nem3
são calções nem são promovidos, eles são literais.10
e3
são avaliados comoint
s pelo compilador?Respostas:
Porque o compilador substitui
10*3
30 no próprio tempo de compilação . Então, efetivamente:short thirty = 10 * 3
é calculado em tempo de compilação.Tente mudar
ten
ethree
parafinal short
(fazendo-os compilar constantes de tempo) e veja o que acontece: PExamine o código de byte usando
javap -v
para ambas as versões (10*3
efinal short
). Você verá que há pouca diferença.Ok, então, aqui está a diferença do código de byte para diferentes casos.
Caso 1 :
Código de byte:
Caso -2:
Código de byte:
Caso -3:
Código de byte:
No caso acima,
10
e3
são retirados das variáveis locaiss1
es2
fonte
Try changing ten and three to final short
exercício :)you will see that there's no difference (between those two lines in the decompiled code)
causa de formulação melhor, não é esse o seu ponto?case 10*3:
e similar é legal em uma construção de switch.Sim, há algo especial acontecendo com o caso literal:
10 * 3
será avaliado em tempo de compilação . Portanto, você não precisa de uma(short)
conversão explícita para literais multiplicados.ten * three
não é avaliável em tempo de compilação, portanto, precisa de uma conversão explícita.Seria diferente se
ten
ethree
fosse marcadofinal
.fonte
A resposta a seguir adiciona a seção JLS e alguns detalhes sobre esse comportamento.
De acordo com JLS §15.2 - Formas de Expressões
fonte