Неявные правила сужения в 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;

Тогда не будет ошибки компилятора, поскольку вы явно указываете компилятору на преобразование.

Другие вопросы по тегам