Cela a moins† à faire avec si ou pas, 3 + 8
est évaluée à l' 11
au moment de la compilation, et plus à voir avec le fait que le compilateur est explicitement autorisé implicitement une étroite int
s pour byte
s dans certains cas. En particulier, la spécification du langage permet explicitement implicite rétrécissement des conversions à l' byte
d'expressions constantes de type int
qui peut s'adapter à un byte
au moment de la compilation.
La section pertinente de la JLS ici est l'article §5.2:
En outre, si l'expression est une expression constante (§15.28) de type byte
, short
,
char
ou int
:
- Un rétrécissement primitive de la conversion peut être utilisé si le type de la
variable
byte
, short
ou char
, et la valeur de la constante
l'expression est représentable dans le type de la variable.
Le moment de la compilation rétrécissement des constantes signifie que le code tel que:
byte theAnswer = 42;
est autorisée. Sans la réduction, le fait que l'entier littéral 42
type int
serait
dire qu'une troupe de byte
serait nécessaire:
†: Évidemment, comme pour la spécification, la constante de l'expression doit être évaluée afin de voir si elle s'inscrit dans la plus étroite de type ou pas. Mais le point saillant est que sans cette section de la spécification, le compilateur ne seraient pas autorisés à faire de l'implicite rétrécissement de conversion.
Soyons clairs ici:
byte a = 3;
byte b = 8;
La raison que ces sont autorisés en raison de la section ci-dessus de la spécification. C'est le compilateur est autorisé à faire l'implicite rétrécissement de conversion de l'littérale 3
d'un byte
. Ce n'est pas parce que le compilateur évalue l'expression constante 3
de sa valeur en 3
au moment de la compilation.