8
votes

Java - Pourquoi le caractère est-il implicitement lancé à la primitive d'octets (et courts), quand il ne devrait pas?

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


1 commentaires

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';


5 Réponses :


1
votes

Pourquoi les travaux suivants fonctionnent-ils aussi?

parce que '&' est une expression constante dont la valeur correspond dans octet .

JLS 14.4.2

Si un déclarant a une expression d'initialisation, l'expression est évaluée et sa valeur est attribuée à la variable.

JLS 5.2

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.

....

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

  • 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.

0 commentaires


0
votes

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 lorsque la valeur est le résultat d'une expression constante uniquement.


0 commentaires

8
votes

Fondamentalement, le Spécification de l'affectation Conversion Spécifie que

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

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.

Votre '&' est précisément "une expression constante de type octet, court, char ou int" .


1 commentaires

Bien que la référence soit correcte (à la spécification d'attribution), le premier paragraphe cité est pas pertinent. Il n'y a pas de types paramétrés dans ces exemples d'affectation. Seul le deuxième paragraphe s'applique.



7
votes

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';


0 commentaires