37 votes

Pourquoi attribuer un octet à un octet ne fonctionne-t-il que lorsque le court-métrage est définitif?

Quelqu'un peut-il s'il vous plaît expliquer pourquoi les compilations suivantes:

 final short s1 = 1;
final char c1 = 1;
byte b1 = s1;
byte b2 = c1;
 

Mais ce qui suit n’est pas le cas (le message d’erreur du compilateur est Type mismatch: cannot convert from short to byte ):

 short s1 = 1;
char c1 = 1;
byte b1 = s1;
byte b2 = c1;
 

48voto

Maroun Maroun Points 31217

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, charou int:

  • Un rétrécissement primitive de la conversion peut être utilisé si le type de la variable est - byte, shortou 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.

17voto

Amadan Points 41944

Dans le premier exemple, le compilateur sait qu' s1 et c1 ne changera jamais, et que leur valeur finale (1) s'inscrit dans byte.

Dans le second, le compilateur de soucis qu'arriverait-il si s1 et c1 ont été à l'extérieur 0..255 -128..127 lorsqu'ils sont affectés à un byte variable, et vous avertit qu'il est dangereux.

Si vous l'avez explicitement les jeter comme de la balalaïka suggère dans les commentaires, le compilateur est soulagé que vous avez l'air de savoir ce que vous faites (ou au moins, qu'il a quelqu'un à blâmer si les choses aller dans le sud), et vous permet de le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X