Неявные правила сужения в Java
byte b = 0xFFFFFFFF; //OK, because integer -1 sits between -128 and 127, FINE!!
char ch = 0xFFFFFFFF; //Not OK, because integer -1 does not sit between 0 and 65535, FINE!!
byte b = 0L; //Compiler says Not OK? But long integer 0 sits between -128 and 127?
Я не убежден в сужении правила, применяемого компилятором Java в третьей строке приведенного выше кода.
Пожалуйста, помогите мне понять логику этого сужающего правила.
2 ответа
L
суффикс на буквальном 0L
делает этот литерал типа long
(64-разрядное целое число со знаком).
Там нет неявного сужения от long
в byte
по правилам языка Java.
См. Раздел " Спецификация языка Java " 5.2 "Контексты назначения":
Кроме того, если выражение является константным выражением (§15.28) типа
byte
,short
,char
, или жеint
:
- Может использоваться сужающее примитивное преобразование, если тип переменной
byte
,short
, или жеchar
и значение константного выражения представимо в типе переменной.
Обратите внимание, что тип константного выражения не включает long
,
Есть два способа преобразования примитивного типа данных в другой. Явное и неявное.
Неявное приведение как в вашем случае byte b = 0L;
выдает ошибку компиляции, так как возможна потеря информации.
Если вы измените это так:
byte b=(byte)0L;
Тогда не будет ошибки компилятора, поскольку вы явно указываете компилятору на преобразование.