No exemplo a seguir
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
Eu não pode lançar -128
com (Integer)
mas pode lançar (int) -128
.
Eu sempre pensei que -128
era do int
tipo e lançá-lo com (int)
deve ser redundante.
O erro na linha com i3
é
cannot find symbol variable Integer
Eu tentei isso com o Java 6 atualização 29 e o Java 7 atualização 1.
Edição: Você obtém o mesmo comportamento com em +128
vez de -128
. Parece haver confusão entre operadores unários e binários.
Integer i = -128;
isso deve compilar, no entanto.Integer i3 = (Integer) (-128);
cumpre.Expression expected
ondeInteger
está.Respostas:
O compilador tenta subtrair
128
de em(Integer)
vez de converter-128
paraInteger
. Adicione()
para corrigi-loDe acordo com BoltClock nos comentários, o elenco
int
funciona como pretendido, porque é uma palavra reservada e, portanto, não pode ser interpretada como um identificador, o que faz sentido para mim.E Bringer128 encontrou a Referência JLS 15.16 .
Como você pode ver, a conversão para um tipo primitivo requer alguma
UnaryExpression
, enquanto a conversão para um tipo de referência requer aUnaryExpressionNotPlusMinus
. Eles são definidos antes do CastExpression no JLS 15.15 .fonte
int
é uma palavra-chave em Java, masInteger
não é. Comoint
é uma palavra-chave, não é possível usá-la como identificador de uma variável ou classe, deixando a única possibilidade de que seja uma conversão de tipo. Isso explicaria isso.Encontrei a referência JLS. 15.16 .
Como você pode ver, a conversão para um tipo primitivo requer alguma
UnaryExpression
, enquanto a conversão para um tipo de referência requer aUnaryExpressionNotPlusMinus
. Eles são definidos antes do CastExpression no JLS 15.15 .Você precisa alterar a conversão para um tipo primitivo:
Ou você pode alterar a expressão à direita do elenco para uma expressão unária não mais-menos:
fonte
O compilador interpreta o
-
operador como menos de dois argumentos, ou seja, está tentando subtrair 128 de outro número chamadoInteger
, mas não há tal variável no escopo.Isso compila:
fonte
(int)
diferença.Isso pode ter a ver com a análise de sintaxe. Notar que
funciona muito bem.
Em geral, você não deve converter na classe Integer. Isso envolve algo chamado boxe automático e pode causar alguns erros sutis no seu código. O método preferido de fazer o que você quer é:
fonte
for (int i in Collection<Integer>)
b / c o NPE estão em local absolutamente inesperado. Na verdade, eu não uso Integer w / autoboxing, pois o intervalo de cache é pequeno (embora possa ser aumentado com a opção XX), mas tenho uma classe chamada IntegerProvider (desde 1.1) para fazer as mesmas coisas. Usando Map (qualquer um dos java.util) Inteiro-> Qualquer coisa geralmente é um problema de desempenho, a menos que seja usada para casos triviais e quase sempre haja uma solução melhor.Ele está analisando como
Integer <minus operator> 128
e não encontrando a variávelInteger
. Você precisará agrupar os-128
colchetes:fonte
O problema é que o
-
compilador o vê como um operador.fonte
A linha 3 é interpretada como se você estivesse tentando deduzir 128 da expressão entre parênteses e a expressão entre parênteses não é e expressão do tipo int (trata o operador '-' como um operador '-'). Se você alterar a expressão para:
então o compilador entenderá que '-' é o menos unário que indica um número inteiro negativo.
fonte
O compilador C # tem o mesmo comportamento. Ele dá uma dica melhor do porquê de não conseguir compilar:
fonte