Ваши трудности связаны с автоматическими преобразованиями типов в Java. Когда вы выполняете операцию сложения, операнды автоматически преобразуются в int перед выполнением операции.
Так что когда вы пишете i = i + i, вы на самом деле сначала приводите i к int, складываете два int, получаете int в ответ и пытаетесь присвоить это обратно byte переменной i.
Если результат сложения больше, чем byte может содержать, вы получите ошибку времени компиляции. Для того чтобы избежать этого, вам нужно явно привести результат обратно к byte:
byte i = 10;
i = (byte) (i + i);
В случае int x = 10; x = x + x; все работает корректно, поскольку int имеет больший диапазон значений, и результат сложения поместится в этот диапазон. Нет необходимости в явном приведении типов.
при этом я же как-то присвоил 10 переменной i, хотя 10 это тип int, ну значит он преобразовался в тип byte
ну так почему результат (10 + 10) не преобразовался в byte, чтоб не допустить возможные ошибки, потому что я могу написать (10 + 200)? ну а тута все работает же, хотя я мог выйти за диапазон int