La réponse est dans la JLS - 5.2. Cession De Conversion:
.. 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 est -
byte
, short
ou char
, et la valeur de la
expression constante est représentable dans le type de la variable.
Lorsque vous écrivez:
final short s1 = 1;
La valeur de l'expression est connue au moment de la compilation, et depuis il ne peut pas être changé, vous n'avez pas besoin de cast.
Dans votre deuxième extrait, la valeur n'est pas connue au moment de la compilation - c'est évaluée dans l' exécution, de sorte que vous aurez besoin d'un cast explicite.
Si vous essayez de compiler le code suivant:
final byte b1 = 200;
final byte b2 = 200;
byte sum = b1 + b1;
Vous obtiendrez une compilation d'erreur puisque les valeurs sur le côté droit sont connus pour le compilateur et il sait que la somme ne peut pas être un byte
.