В следующем примере
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
Я не могу бросить -128
с , (Integer)
но я могу бросить (int) -128
.
Я всегда думал, что -128
это int
тип, и приведение его (int)
должно быть излишним.
Ошибка на линии с i3
IS
cannot find symbol variable Integer
Я пробовал это с обновлением Java 6 29 и обновлением Java 7 1.
РЕДАКТИРОВАТЬ: вы получаете то же поведение +128
вместо -128
. Похоже, что это путаница между унарными и бинарными операторами.
Integer i = -128;
однако это должно компилироваться.Integer i3 = (Integer) (-128);
хотя и соответствует.Expression expected
тамInteger
.Ответы:
Компилятор пытается вычитать
128
из(Integer)
вместо преобразования-128
вInteger
. Добавить,()
чтобы исправитьСогласно BoltClock в комментариях, приведение к работе
int
работает по назначению, потому что это зарезервированное слово и поэтому не может быть интерпретировано как идентификатор, что имеет смысл для меня.И Bringer128 нашел JLS Reference 15.16 .
Как видите, приведение к примитивному типу требует любого
UnaryExpression
, тогда как приведение к ссылочному типу требуетUnaryExpressionNotPlusMinus
. Они определены непосредственно перед CastExpression в JLS 15.15 .источник
int
это ключевое слово в Java, ноInteger
это не так. Посколькуint
это ключевое слово, вы не можете использовать его в качестве идентификатора переменной или класса, оставляя единственную возможность для него быть приведением типа. Это объяснило бы это.Я нашел ссылку на JLS. 15.16 .
Как видите, приведение к примитивному типу требует любого
UnaryExpression
, тогда как приведение к ссылочному типу требуетUnaryExpressionNotPlusMinus
. Они определены непосредственно перед CastExpression в JLS 15.15 .Вам нужно либо изменить приведение к примитивному типу:
Или вы можете изменить выражение справа от приведения на унарное выражение, отличное от плюс-минус:
источник
Компилятор интерпретирует
-
оператор как оператор «минус» с двумя аргументами, т.е. он пытается вычесть 128 из некоторого другого указанного числаInteger
, но такой переменной в области видимости нет.Это компилирует:
источник
(int)
имеет значение.Возможно, это связано с синтаксическим анализом. Заметь
работает нормально.
В общем, вы не должны приводить к классу Integer. Это включает в себя то, что называется автоматическим блокированием, и может вызвать некоторые незаметные ошибки в вашем коде. Предпочтительный способ делать то, что вы хотите:
источник
for (int i in Collection<Integer>)
b / c, NPE находится в совершенно неожиданном месте. На самом деле я не использую Integer с автобоксингом, поскольку диапазон кеширования невелик (хотя его можно увеличить с помощью параметра XX), но у меня есть класс IntegerProvider (с версии 1.1), чтобы делать то же самое. Использование карты (любого из java.util) Integer-> Anything обычно снижает производительность, если только оно не используется в тривиальных случаях, и почти всегда есть лучшее решение.Он анализирует его как
Integer <minus operator> 128
и не находит переменнуюInteger
. Вам нужно будет заключить-128
в скобки:источник
Проблема в том, что
-
компилятор видит в нем оператора.источник
Строка 3 интерпретируется так, как будто вы пытаетесь вычесть 128 из выражения в круглых скобках, а выражение в скобках не является выражением типа int (оно обрабатывает '-' как оператор '-'). Если вы измените выражение на:
тогда компилятор поймет, что «-» - это унарный минус, обозначающий отрицательное целое число.
источник
Компилятор C # ведет себя так же. Это дает лучший намек, почему он не компилируется:
источник