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:
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
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. –
@MickMnemonic 'final' importe dans le 2ème exemple, car il fait de' i2' une expression constante. – Radiodef
@Radiodef, mais OP demande spécifiquement à propos de la première conversion où 'final' n'est pas pertinent. –