En el siguiente ejemplo
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
No puedo fundido -128
con (Integer)
pero puedo fundido (int) -128
.
Siempre pensé que -128
era de int
tipo y lanzarlo (int)
debería ser redundante.
El error en la línea con i3
es
cannot find symbol variable Integer
Intenté esto con Java 6 actualización 29 y Java 7 actualización 1.
EDITAR: Obtiene el mismo comportamiento con en +128
lugar de -128
. Parece ser una confusión entre operadores unarios y binarios.
Integer i = -128;
esto debería compilar, sin embargo.Integer i3 = (Integer) (-128);
cumple sin embargo.Expression expected
dondeInteger
está.Respuestas:
El compilador intenta restar
128
de en(Integer)
lugar de enviar-128
aInteger
. Agregar()
para arreglarloSegún BoltClock en los comentarios, el elenco
int
funciona según lo previsto, porque es una palabra reservada y, por lo tanto, no puede interpretarse como un identificador, lo que tiene sentido para mí.Y Bringer128 encontró la referencia JLS 15.16 .
Como puede ver, la conversión a un tipo primitivo requiere cualquiera
UnaryExpression
, mientras que la conversión a un tipo de referencia requiere aUnaryExpressionNotPlusMinus
. Estos se definen justo antes de CastExpression en JLS 15.15 .fuente
int
es una palabra clave en Java, peroInteger
no lo es. Dado queint
es una palabra clave, no puede usarla como un identificador para una variable o una clase, dejando la única posibilidad que queda para que sea una conversión de texto. Eso lo explicaría.Encontré la referencia de JLS. 15.16 .
Como puede ver, la conversión a un tipo primitivo requiere cualquiera
UnaryExpression
, mientras que la conversión a un tipo de referencia requiere aUnaryExpressionNotPlusMinus
. Estos se definen justo antes de CastExpression en JLS 15.15 .Debe cambiar el reparto a un tipo primitivo:
O puede cambiar la expresión a la derecha de la conversión a una expresión unaria no más-menos:
fuente
El compilador interpreta el
-
como el operador negativo de dos argumentos, es decir, está tratando de restar 128 de algún otro número nombradoInteger
, pero no existe tal variable en el alcance.Esto compila:
fuente
(int)
hace la diferencia.Esto puede tener que ver con el análisis sintáctico. Darse cuenta de
funciona bien
En general, no debes lanzar a la clase Integer. Esto implica algo llamado auto-boxeo y puede causar algunos errores sutiles en su código. El método preferido para hacer lo que quiere es:
fuente
for (int i in Collection<Integer>)
b / c el NPE está en una ubicación absolutamente inesperada. En realidad, no uso Integer w / autoboxing ya que el rango de caché es pequeño (aunque se puede aumentar con la opción XX), pero tengo una clase llamada IntegerProvider (desde 1.1) para hacer lo mismo. Usando Map (any from java.util) Integer-> Cualquier cosa es generalmente un golpe de rendimiento a menos que se use para casos triviales y casi siempre hay una mejor solución.Lo analiza
Integer <minus operator> 128
y no encuentra la variableInteger
. Tendrá que envolver los-128
corchetes:fuente
El problema es que el
-
compilador lo ve como un operador.fuente
La línea 3 se interpreta como si estuviera tratando de deducir 128 de la expresión entre paréntesis y la expresión entre paréntesis no es y expresión de tipo int (trata el operador '-' como un operador '-'). Si cambia la expresión a:
entonces el compilador comprenderá que '-' es el signo menos unario que indica un número entero negativo.
fuente
El compilador de C # tiene el mismo comportamiento. Sin embargo, da una mejor pista de por qué no se compila:
fuente