2017-09-13 4 views
-2

Il n'y a pas d'erreur lorsque j'essaie d'effectuer un autobox i2 à Byte, mais lorsque je l'inverse (b1 à Integer), une erreur se produit.Pourquoi la variable d'octet final ne peut pas être convertie en nombre entier pendant la mise en boîte automatique?

 final byte b1 = 1; 
     Integer i1 = b1; //error 

     final int i2 = 1; 
     Byte b2 = i2;// no error 

     byte b3 = 1; 
     int i3 = b3; // no error 
+0

Je pense que l'explication est dans [cette réponse] (https://stackoverflow.com/a/45105159/905488). Je ne vois pas comment la variable 'final' fait une différence. –

+0

@MickMnemonic 'final' importe dans le 2ème exemple, car il fait de' i2' une expression constante. – Radiodef

+0

@Radiodef, mais OP demande spécifiquement à propos de la première conversion où 'final' n'est pas pertinent. –

Répondre

1

Puis-je suggérer que vous lisez JLS Sec 5.2, que je Liée à la réponse à votre previous similar question.

contextes d'attribution permettent l'utilisation d'une des opérations suivantes:

  • une conversion d'identité (§5.1.1)

  • une conversion primitive (§5.1.2) élargissant

  • une conversion de référence d'élargissement (§5.1.5)

  • un boxi conversion ng (§5.1.7) éventuellement suivie d'un élargissement conversion de référence

  • une conversion unboxing (§5.1.8) suivie éventuellement d'un élargissement conversion primitive.

...

En outre, si l'expression est une expression constante (§15.28) de l'octet de type, court, char, ou int:

  • Un rétrécissement de conversion primitive peut être utilisé si le type de la variable est byte, short ou char, et la valeur de l'expression constante est représentable dans le type de la variable.
  • Un rétrécissement de conversion primitive suivie d'une conversion de boxe peuvent être utilisés si le type de la variable est la suivante:

    • octet et la valeur de l'expression constante est représentable dans l'octet de type.
    • ...

Prendre votre cas dans l'ordre inverse:

byte b3 = 1; 
    int i3 = b3; // no error 

Attribution d'un byte à un int est simplement une conversion élargissement.

final int i2 = 1; 
    Byte b2 = i2;// no error 

C'est exactement le même que votre question précédente: vous pouvez attribuer une valeur constante int à un Byte, à condition que la valeur de cette int s'insère dans un byte.

final byte b1 = 1; 
    Integer i1 = b1; //error 

Vous essayez de faire un élargissement conversion primitive, suivie d'une conversion de boxe . Ce n'est pas l'un des cas énumérés ici, donc c'est une erreur.

Vous pouvez résoudre ce problème avec un élargissement explicite coulé:

Integer i1 = (int) b1; //ok