2016-03-19 1 views

Répondre

0

Je ne suis pas sûr, pourquoi int pour byte cast automatique est possible ... Fondamentalement (selon les règles java sur les primitives de casting automatique) il ne devrait pas.

Règle principale dans le cast automatique avec primitives: "nous ne perdrons pas d'information". Donc, il est possible d'élargir seulement les types. Alors int sera casté à long (pas de perte d'information) tandis que long ne peut pas être casté automatiquement en int (long peut contenir des nombres plus grands que la valeur entière maximale). Cette règle doit être exactement passé à octet ... mais vous trouvez que int octet cast automatique est possible ...

+2

La raison pour laquelle la première conversion fonctionne est parce que le bytecode généré pour 'final int a = 100' est' bipush' qui pousse un octet sur la pile comme un int et 'final' est utilisé pour faire' a' un * compile-time constante * – TheLostMind

+0

@TheLostMind La raison pour laquelle la première conversion fonctionne est que le JLS l'a défini pour fonctionner, et le JLS ne l'a pas défini pour les constantes longues affectées à un octet, même si la valeur est dans la plage d'un octet. –

+1

@ErwinBolwidt - Nous disons la même chose de différentes manières. Bien sûr, cela doit être là dans la JLS – TheLostMind

0

Selon la documentation -

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.

Ici, ils n'ont pas mentionné le long, donc il doit être explicitement classé par le développeur.
référence-https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

0

Ce comportement est vraiment maladroit. En passant, si vous augmentez la valeur de la variable int à 1000, par exemple, le code donnera la même erreur de conversion. C'est une sorte d'incohérence car il semble que pour les types qui utilisent un mot pour stocker leurs valeurs sont vérifiés pour les limites de valeur alors que les «grands» types comme long ne le sont pas. Cependant, c'est une mauvaise idée d'utiliser implicitement de telles distributions.