Certaines fonctionnalités du compilateur m'intéplent (Oracle JDK 1.7 à l'aide de Eclipse).
J'ai donc ce livre qui dit que le charme primitif doit être explicitement monté à court et à des octets, ce qui a tout de sens en raison des types de données 'Les gammes autorisées ne se chevauchent pas. P>
En d'autres termes, au-delà des travaux de code (mais ne fonctionnerait pas sans les couts de type explicites): P>
byte bt = (byte)'&'; System.out.println(bt); // Correctly displays number 38 on the console
5 Réponses :
Pourquoi les travaux suivants fonctionnent-ils aussi? P> blockQuote>
parce que
'&' code> est une expression constante dont la valeur correspond dans
octet code>. p>
JLS 14.4.2 P>
Si un déclarant a une expression d'initialisation, l'expression est évaluée et sa valeur est attribuée à la variable. P> blockQuote>
JLS 5.2 P>
La conversion d'affectation se produit lorsque la valeur d'une expression est attribuée (§15.26) à une variable: le type de l'expression doit être converti au type de variable. P>
.... p>
De plus, si l'expression est une expression constante (§15.28) de type octet, court, char ou int: p>
- Une conversion primitive de rétrécissement peut être utilisée si le type de variable est d'octets, courts ou caractères, et la valeur de l'expression constante est représentable dans le type de variable. LI> ul> blockQuote>
Je ne sais pas que cette explication est suffisante ou non, mais ce comportement est défini dans les JLS. Du JLS, section 5.2 A >: p>
En outre, si l'expression est un
expression constante (§15.28) de type
octet, court, char ou int: p>
L'expression "&" dans votre initialisateur pour la variable BC est une expression constante. L'expression C qui se trouve dans votre initialisateur pour les variables B et S n'est pas une expression constante. Java effectue des conversions implicites de rétrécissement des primitives lorsque le contexte le requiert
Fondamentalement, le Spécification de l'affectation Conversion Spécifie que P>
De plus, si l'expression est une expression constante (§15.28) de type octet, court, char ou int: p>
Une conversion primitive de rétrécissement peut être utilisée si le type de La variable est d'octets, courts ou caractères, et la valeur de la constante L'expression est représentable dans le type de variable. P> blockQuote>
Votre
'&' code> est précisément "une expression constante de type octet, court, char ou int" em>. p>
Bien que la référence soit correcte (à la spécification d'attribution), le premier paragraphe cité est pas i> pertinent. Il n'y a pas de types paramétrés dans ces exemples d'affectation. Seul le deuxième paragraphe s'applique.
Ceci s'appelle rétrécissement de la compilation des constantes em>. Il est décrit à la section 5.2 de la spécification de langue Java: Le rétrécissement de la compilation des constantes signifie que le code tel que: p>
byte bc = (byte)'\uff12';
Mettez simplement, le compilateur peut déterminer si une constante peut être réduite en toute sécurité. Il générera une erreur de temps compilte s'il existe une perte de précision, essayez celui-ci à comparaison: octet b = '\ u20ac';