122 votes

Vous avez une idée de la raison pour laquelle je dois convertir un entier littéral en (int) ici ?

Dans l'exemple suivant

int i = -128;
Integer i2 = (Integer) i; // compiles

Integer i3 = (Integer) -128; /*** Doesn't compile ***/

Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles

Je ne peux pas lancer -128 con (Integer) mais je peux lancer (int) -128 .

J'ai toujours pensé -128 était de int et le couler avec (int) devrait être redondant.

L'erreur sur la ligne avec i3 est

cannot find symbol variable Integer

J'ai essayé ceci avec Java 6 update 29 et Java 7 update 1.

EDIT : Vous obtenez le même comportement avec +128 au lieu de -128 . Il semble qu'il y ait une confusion entre les opérateurs unaires et binaires.

151voto

Jens Schauder Points 23468

Le compilateur essaie de soustraire 128 de (Integer) au lieu de couler -128 à Integer . Ajouter () pour le réparer

Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles

Selon BoltClock, dans les commentaires, le casting à int fonctionne comme prévu, parce que c'est un mot réservé et qu'il ne peut donc pas être interprété comme un identifiant, ce qui me paraît logique.

Et Bringer128 a trouvé la Référence JLS 15.16 .

 _**CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus**_

Comme vous pouvez le voir, le transfert vers un type primitif nécessite un certain nombre d'éléments. UnaryExpression alors que le transfert vers un type de référence nécessite un UnaryExpressionNotPlusMinus . Ils sont définis juste avant l'expression CastExpression à l'endroit suivant JLS 15.15 .

48voto

Bringer128 Points 3590

J'ai trouvé la référence à JLS. 15.16 .

 _**CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus**_

Comme vous pouvez le voir, le transfert vers un type primitif nécessite un certain nombre d'éléments. UnaryExpression alors que le transfert vers un type de référence nécessite un UnaryExpressionNotPlusMinus . Ils sont définis juste avant l'expression CastExpression à l'endroit suivant JLS 15.15 .

Vous devez soit changer le cast en un type primitif :

... (int) -128;

Ou vous pouvez changer l'expression à droite de la distribution en une expression unaire non plus-moins :

... (Integer) (-128);  // Either
... (Integer) 0 - 128; // Or

12voto

Barend Points 8232

Le compilateur interprète les - comme l'opérateur moins à deux arguments, c'est-à-dire qu'il essaie de soustraire 128 d'un autre nombre nommé Integer mais il n'y a pas de telle variable dans la portée.

Cela se compile :

Integer i3 = (Integer) (-128)

9voto

Koliber Services Points 2785

Cela peut avoir un rapport avec l'analyse syntaxique. Remarquez que

Integer i4 = (Integer) (-128); 

fonctionne très bien.

En général, vous ne devez pas effectuer de cast vers la classe Integer. Cela implique ce que l'on appelle l'auto-boxing, et peut provoquer des erreurs subtiles dans votre code. La méthode préférée pour faire ce que vous voulez est la suivante :

Integer i6 = Integer.valueOf(-128)

9voto

Bohemian Points 134107

C'est analysé comme Integer <minus operator> 128 et ne pas trouver la variable Integer . Vous devrez envelopper le -128 entre parenthèses :

Integer i3 = (Integer) (-128);  // compiles

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X