язык сбивает с толку.
По сути, вы не можете так поступить:
байт -> байт -> длинный
потому что Байт и Лонг не разделяют отношения.
Итак, он пытается сделать это:
байт -> длинный -> длинный
Но он также не может этого сделать (очевидно, из-за ограничений компилятора). Таким образом, он терпит неудачу и выдает ошибку.
Но, с другой стороны, вы МОЖЕТЕ сделать это:
byte -> Byte -> Object
потому что Байт - это Объект.
Рассмотрим 2 функции и байтовую переменную:
toLong (Long x)
toObject (Object x)
байт b = 5;
Тогда это утверждение будет незаконным:
toLong (б);
// потому что b -> новый байт (b) -> новый длинный (новый байт (b)) недопустим.
AND byte -> long -> Long не может быть сделано из-за ограничений компилятора.
но это утверждение законно:
toObject (b);
// потому что b -> новый байт (b) -> новый объект (новый байт (b)) допустим.