В языке программирования Java, переменные типа byte и short могут автоматически преобразовывать литералы типа int в соответствующие типы byte и short. Это происходит потому, что значения типа int могут быть безопасно преобразованы в значения типов byte и short без потери данных, так как диапазон значений типа int шире, чем диапазон значений типов byte и short.
Однако, с типом long такое преобразование не происходит автоматически. Литералы типа int не могут быть присвоены переменным типа long без явного указания типа. Для присвоения литерала типа int переменной типа long, необходимо добавить суффикс "L" или "l" к литералу. Например, для присвоения значения 10 типа long, нужно написать "long x = 10L;". Это необходимо для явного указания, что значение должно быть интерпретировано как тип long.
Причина такого поведения связана с тем, что в Java является строго типизированным языком программирования, и преобразование между различными типами требует явного указания или явного приведения типов для обеспечения безопасности данных и избежания потери информации.
Дополняю ответ:
Переменные типа byte и short автоматически преобразуют литерал типа int в byte/short, потому что они занимают меньше памяти, чем int, и могут хранить значения в более ограниченном диапазоне. Например, переменная типа byte может хранить значения от -128 до 127, а переменная типа short - от -32 768 до 32 767. С другой стороны, переменная типа long занимает больше памяти (8 байт) и может хранить значения в более широком диапазоне (от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807). Поэтому, чтобы явно указать, что литерал должен быть интерпретирован как значение типа long, необходимо добавить к нему суффикс "L" или "l". Если не добавить суффикс, компилятор будет считать литерал типа int, что может привести к ошибке, если значение выходит за диапазон переменной типа byte. Например, запись "byte x = 10L;" вызовет ошибку компиляции, потому что значение 10L не может быть преобразовано в тип byte.
На Java, операция преобразования типов (type casting) между различными примитивными типами данных может быть выполнена только, если целевой тип данных имеет большую емкость (размер) по сравнению с исходным типом данных.Тип byte имеет размер 8 бит, а тип int имеет размер 32 бита. Поэтому, при преобразовании числа 10 типа int в тип byte, это возможно, так как тип byte может вместить значение 10 без потери данных. Однако, при преобразовании числа 10 типа long в тип byte, это невозможно, так как тип byte не может вместить значение типа long без потери данных.Преобразование типов в Java может быть выполнено явно с использованием операции преобразования типов, указывая целевой тип в скобках перед исходным значением. Например, для преобразования числа 10 типа long в тип byte, нужно использовать следующую операцию:
long a = 10;
byte b = (byte) a;
Операция преобразования типов может привести к потере данных, если целевой тип данных имеет меньшую емкость по сравнению с исходным типом данных. Поэтому, при преобразовании типов следует быть внимательным и учитывать возможность потери данных