Это потому, что не все целые числа помещаются в байт.
В вашем первом примере значение a
известно и не может измениться. Компилятор знает, что он уместится в байт.
Во втором примере, поскольку a
не является окончательным, возможно, его можно было изменить (хотя и не в вашем примере). Компилятор Java не настолько умен, чтобы заметить, что ничего не изменило его, поэтому больше не уверен, что он уместится в байт.
В качестве примера рассмотрим следующее:
final int a = 10000;
byte b = a;
Поскольку значение a
теперь слишком велико, чтобы поместиться в int, оно больше не компилируется.