2017-01-21 4 views
2

J'ai écrit un programme.Rétrécissement implicite lors de la sommation des constantes vs rétrécissement explicite lors de la sommation des variables

class First 
{ 
     public static void main(String[] args) 
     { 
       int c = 5; 
       byte b = c+6; 
       System.out.println(b); 
     } 
} 

Et ma sortie javac est:

error: incompatible types: possible lossy conversion from int to byte 
     byte b = c+6; 
       ^
1 error 

Mais si je modifie le programme:

class First 
{ 
     public static void main(String[] args) 
     { 
       byte b = 5+6; 
       System.out.println(b); 
     } 
} 

Il exécute bien, sortie:

11 

Je sais qu'avant l'opération, les deux opérandes ted en entier. Ensuite, l'opérateur + donne un entier. Mais si la variable c était un entier, alors la constante 5 est aussi un entier par défaut. Pourquoi javac ne génère-t-il pas une erreur dans le second cas?

Veuillez me guider si je me trompe conceptuellement.

Répondre

3

Selon Section 5.2 du JLS:

Le rétrécissement de la compilation d'expressions constantes signifie que le code tel que:

octet TheAnswer = 42; est autorisé. Sans le rétrécissement, le fait que le littéral entier 42 ait le type int signifierait qu'un cast en octet serait requis:

octet theAnswer = (octet) 42; // cast est autorisé mais non requis

Une expression constante est en outre définie dans Section 15.28 de JLS. Puisque l'expression 5+6 est une expression constante qui correspond à la plage de byte, elle sera automatiquement rétrécie au moment de la compilation sans nécessiter de conversion explicite. D'autre part, puisque l'expression c+6 n'est pas une expression constante, elle ne sera pas automatiquement rétrécie et une conversion explicite est requise.