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
avec (Integer)
mais je peux lancer (int) -128
.
J'ai toujours pensé que -128
c'était du int
type et le lancer avec (int)
devrait être redondant.
L'erreur sur la ligne avec i3
est
cannot find symbol variable Integer
J'ai essayé cela avec la mise à jour 29 de Java 6 et la mise à jour 1 de Java 7.
EDIT: Vous obtenez le même comportement avec +128
au lieu de -128
. Il semble y avoir confusion entre les opérateurs unaires et binaires.
Integer i = -128;
cela devrait cependant compiler.Integer i3 = (Integer) (-128);
conforme cependant.Expression expected
où leInteger
est.Réponses:
Le compilateur essaie de soustraire
128
de(Integer)
au lieu de convertir-128
enInteger
. Ajouter()
pour le réparerSelon BoltClock, dans les commentaires, le cast
int
fonctionne comme prévu, car il s'agit d'un mot réservé et ne peut donc pas être interprété comme un identifiant, ce qui a du sens pour moi.Et Bringer128 a trouvé la référence JLS 15.16 .
Comme vous pouvez le voir, la conversion en un type primitif en nécessite n'importe quel
UnaryExpression
, tandis que la conversion en un type de référence nécessite unUnaryExpressionNotPlusMinus
. Celles-ci sont définies juste avant CastExpression à JLS 15.15 .la source
int
c'est un mot-clé en Java, mais ceInteger
n'est pas le cas. Puisqu'ilint
s'agit d'un mot-clé, vous ne pouvez pas l'utiliser comme identifiant pour une variable ou une classe, laissant la seule possibilité qu'il soit un transtypage. Cela expliquerait cela.J'ai trouvé la référence JLS. 15.16 .
Comme vous pouvez le voir, la conversion en un type primitif en nécessite n'importe quel
UnaryExpression
, tandis que la conversion en un type de référence nécessite unUnaryExpressionNotPlusMinus
. Celles-ci sont définies juste avant CastExpression à JLS 15.15 .Vous devez soit changer la distribution en un type primitif:
Ou vous pouvez changer l'expression à droite de la distribution en une expression unaire non plus moins:
la source
Le compilateur interprète le
-
comme l'opérateur moins à deux arguments, c'est-à-dire qu'il essaie de soustraire 128 à un autre nombre nomméInteger
, mais il n'y a pas de telle variable dans la portée.Cela compile:
la source
(int)
fait une différence.Cela peut être lié à l'analyse syntaxique. Remarquerez que
fonctionne très bien.
En général, vous ne devez pas convertir en classe Integer. Cela implique quelque chose appelé 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 source
for (int i in Collection<Integer>)
b / c le NPE est à un endroit absolument inattendu. En fait, je n'utilise pas Integer w / autoboxing car la plage de cache est petite (bien qu'elle puisse être augmentée avec l'option XX) mais j'ai une classe appelée IntegerProvider (depuis 1.1) pour faire la même chose. Utilisation de Map (any from java.util) Integer-> Anything est généralement un problème de performances à moins qu'il ne soit utilisé pour des cas triviaux et qu'il existe presque toujours une meilleure solution.Il analyse
Integer <minus operator> 128
et ne trouve pas la variableInteger
. Vous devrez mettre-128
entre parenthèses:la source
Le problème est que le
-
compilateur le voit comme un opérateur.la source
La ligne 3 est interprétée comme si vous essayez de déduire 128 de l'expression entre parenthèses et l'expression entre parenthèses n'est pas une expression de type int (elle traite le «-» comme un opérateur «-»). Si vous modifiez l'expression en:
alors le compilateur comprendra que «-» est le moins unaire qui indique un entier négatif.
la source
Le compilateur C # a le même comportement. Cela donne une meilleure idée de la raison pour laquelle la compilation échoue:
la source