Сужение преобразования типов: почему в объявлении допускается присваивание int байту? - PullRequest
5 голосов
/ 08 июля 2011

Это может показаться слишком тривиальным для программиста среднего уровня Java.Но во время моего обзора основ Java я нашел вопрос:

Почему разрешено сужающее преобразование, например:

byte b = 13;

, а

int i = 13;
byte b = i;

будет жаловатьсякомпилятором?

Ответы [ 5 ]

10 голосов
/ 08 июля 2011

Потому что byte b = 13 ; это присвоение константы.Его значение известно во время компиляции, поэтому компилятор может / должен / скулить, если присвоение значения константы приведет к переполнению (попробуйте byte b = 123456789 ; и посмотрите, что произойдет.)переменной, вы присваиваете значение выражения , которое, хотя оно вполне может быть инвариантным, компилятор этого не знает.Это выражение может привести к переполнению, поэтому компилятор скулит.

3 голосов
/ 08 июля 2011

С здесь :

Преобразование назначения происходит, когда значение выражения присваивается (§15.26) к переменной: тип выражение должно быть преобразовано в тип переменной. присваивание контексты позволяют использовать личность преобразование (§5.1.1), расширение примитивное преобразование (§5.1.2) или расширение эталонного преобразования (§5.1.4). Кроме того, сужение примитивное преобразование может быть использовано, если все следующие условия удовлетворены:

  • Выражение является константным выражением типа byte, short, char или int.
  • Тип переменной - byte, short или char.
  • Значение выражения (которое известно во время компиляции, поскольку оно является константным выражением) представимо в типе переменной.

В вашем примере все три условия выполнены, поэтому сужающее преобразование разрешено.

P.S. Я знаю, что источник, который я цитирую, старый, но этот аспект языка с тех пор не изменился.

0 голосов
/ 12 мая 2014

Преобразование из числа с меньшим диапазоном величины (например, int в long или long для float) называется расширением.Целью расширения конверсий является отсутствие изменения величины числа при сохранении максимально возможной точности.Например, преобразование int 2147483647 в число с плавающей точкой дает 2,14748365e9 или 2 147 483 650.Разница обычно невелика, но она может быть значительной.

И наоборот, преобразование, при котором существует вероятность потери информации о величине числа (например, long to int или double to long), называется сужением.При сужающихся конверсиях некоторая информация может быть потеряна, но при возможности можно найти ближайшее представление.Например, преобразование числа с плавающей точкой 3.0e19 в long дает -9223372036854775807, совсем другое число.

0 голосов
/ 08 июля 2011

Байт имеет 8 бит. Int, 32 бита, и это число со знаком.

0 голосов
/ 08 июля 2011

Поскольку буквальное число не имеет типа.

Как только вы дадите ему тип, он должен быть приведен к другому:

int i = 13;
byte b = (byte) i;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...