В Java мы можем упаковать и затем расшириться. Почему наклон мы расширяемся и поле? Поскольку исключая:
class WidenAndBox{
static void go(Long x) { }
public static void main(String [] args)
{
byte b=5;
go(b);
}
}
Ошибка компилятора
Я не знаком с тем, как была написана спецификация, но в общем, вы не кастинг автоматически между несовместимыми классами. Расширение примитивов - это отдельный вопрос, а правила расширения Java были изложены задолго до того, как в язык был добавлен автобокс. Это компромисс между тем, чтобы компилятор ловил ваши ошибки и не раздражал вас мелкими деталями.
В случае с вашим примером, если бы вы долго занимались автобоксированием, вы тоже были бы в порядке, или если бы вы сделали функцию, которая принимала в качестве параметра Number, вы тоже были бы в порядке. Вы можете подумать, что компилятор должен помочь вам в этом, понимая, что байт может быть легко распакован и перебоксован как Long, но люди, которые делают компилятор, не согласны с этим, и я тоже не согласен.
Я считаю, что главная причина - производительность. Если бы Вы разрешили произвольную комбинацию расширения и (un)бокса, то необходимо было бы проверить на наличие более подходящих методов. Особенно в контексте, когда функции берут несколько примитивных параметров малого диапазона, количество возможных комбинаций может стать достаточно большим.